#Summary (National): According to the Wage and Hour Compliance Action data, Texas has the highest number of wage theft cases, with 45,983 individual cases, while Florida has the highest total number of violations, with 1,185,054 violations across 29,046 cases. When adjusted for population, West Virginia has the highest number of wage theft cases per 10,000 people, with 20 cases per 10,000 residents. Missouri ranks 18th on this list, with around 13 cases per 10,000 people. In terms of violations per 10,000 people, Arkansas ranks first with 2,910 violations, while Missouri ranks 35th, with 212 violations per 10,000 people. Among companies, Subway has the most wage theft cases filed against it, totaling 1,359 cases. Wells Fargo has the highest number of violations, with 530,002 violations—although all from a single case. Walmart has the highest average number of affected employees per case, with 104 cases across all states and an average of 848 employees affected per case, totaling 88,278 workers. Dollar General had the highest average number of violations per case. The company was involved in 84 cases with a total of 141,139 violations, which means it committed about 1,680 violations per case on average. The Puerto Rico Department of Corrections was required to pay the highest amount in back wages—$39,950,933.10. Industry-wise, the restaurant and hotel industry has the highest total number of wage theft violations. However, in terms of average violations per case, Health and Personal Care Stores rank highest, with about 3,710 violations per case. Over the last 10 years, both the number of wage theft cases and violations have declined, suggesting possible improvement—especially with the enforcement of laws like the Family and Medical Leave Act (FMLA) and child labor protections. Rhode Island takes the longest time to complete a case, with an average of 675 days, which is almost two years. The median time to complete a case there is even higher—728 days.

#Project idea: Navigating Wage Theft in America #Details: Create a interactive portal where people explore decade-long trends in wage theft by state, industry, employer and all other related information.

#Story idea: #1. Wage theft cases are going down—but why? An analysis of why wage theft is happening less often now and if that’s really a good sign. #2. Workers in Health and Personal Care Stores faces the most wage theft. Why and how people in the Health and Personal Care Stores are the most likely to be affected by wage theft. #3. Why West Virginia and Arkansas have the most wage theft in per 10,000 population? An investigative look at why these two states have more wage theft than others. #4. Why does Rhode Island take the longest time to conclude a wage theft case? Explore the reasons behind Rhode Island’s unusually long average case duration for resolving wage theft.

#Summary (Missouri): In Missouri, George’s Processing, Incorporated had the highest number of Wage & Hour Compliance violations, with 3,148 violations across 2 cases. The company also paid the highest amount in back wages—$1,245,257.09—to 3,084 employees. It affected the most workers in the state, with a total of 3,147 employees impacted. However, since businesses vary in size, comparing total numbers alone may not provide a complete picture. When looking at the average number of violations per case, the results differ— Imo’s Pizza had the highest average, with about 23 violations per case. Missouri Vegetable Farm paid the highest civil money penalties, totaling $384,626.61. The city of St. Louis recorded the highest number of cases, violations, and affected employees in Missouri, with 1,487 cases, 25,019 violations, and 21,956 affected employees, respectively. Over the past 10 years, Missouri has seen a decline in wage and hour violations, with cases dropping from 318 in 2020 to just 6 in 2024. The average time to resolve a Wage & Hour Compliance case in Missouri is 589 days, while the median time is 728 days—about two years. One case, involving Blue Springs Lawn & Garden, took 4,840 days—more than 13 years—to complete.

#Story idea: #1: Missouri’s declining wage theft trends Analyzing the decline in wage theft violations in Missouri over the last decade, from 318 cases in 2020 to just 6 in 2024. What’s driving this positive trend, and what’s still being missed? #2. Wage theft in Saint Louis the highest violations in Missouri A focus on Saint Louis, which recorded 1,487 cases and 25,019 violations. This story would explore the impact on workers and what is being done to address the problem. #3. Why did the wage theft case against Blue Springs Lawn & Garden in Blue Springs, Missouri, take more than 13 years to complete? Investigate the the unusually long duration to complete the case.

#Load library

library(tidyverse)
── Attaching core tidyverse packages ───────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors

#Load data #Process: I imported the data with the name “wage_theft” using the “read_csv” code.

wage_theft <- read_csv("data/whd_whisard.csv")
Rows: 357269 Columns: 110
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr   (8): trade_nm, legal_name, street_addr_1_txt, cty_nm, st_cd, naic_cd, naics_code_description, flsa_repeat_violator
dbl  (99): case_id, zip_cd, case_violtn_cnt, cmp_assd, ee_violtd_cnt, bw_atp_amt, ee_atp_cmt, flsa_violtn_cnt, flsa_bw_atp_amt, flsa_ee_a...
date  (3): findings_start_date, findings_end_date, ld_dt

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

#Data assesment: #Get to know the data/ Data dictionary: 1. How many rows? #Answer: 357,269 rows

  1. What is one row?- #Answer: Each row represents a single, concluded compliance action (investigation or case) conducted by the Department of Labor at a specific employer.

  2. How many column?- #Answer: Initially, the dataset contained 110 columns. However, several columns contained only zero values and no meaningful data, so I excluded those. After removing these columns, the number of columns was reduced to 94. Next, I extracted the ‘finding_start_date’ column into separate columns for Date, Month, and Year to enable more detailed time-based analysis. This transformation increased the total number of columns to 97, with the addition of the new ‘Date’, ‘Month’, and ‘Year’ columns.

  3. What is in every column? #Answer: The data set begins with the case ID, followed by the employer’s name, address, and the case start and end dates. In addition to these demographic details, there are nearly 100 columns containing data related to the number of violations, back wage amounts, and fines. From these, the 20 most relevant indicators will be selected for analysis.

#Exclude the columns that contain only zeros in all rows.

#Process: I used the select() function to choose which columns to keep, combined with where(~!all(. == 0)) to filter out columns where all values are zero. The code ~!all(. == 0), means “keep columns where not all values are zero”. It removes only columns where every single value is zero. The result was stored back in the original dataset called MO_wage_theft.

wage_theft %>%
  select (where (~ sum (.! = 0, na.rm = TRUE) >0))
Error: unexpected '!' in:
"wage_theft %>%
  select (where (~ sum (.!"

#Process: At this point in my analysis, I wanted to separate the month and year from the findings_start_date column to perform time-based analysis. Initially, I used the mdy() function to convert the findings_start_date into separate Date, Month, and Year components. However, I realized that the actual date format was “ymd”, so I switched to using the ymd() function to properly extract the Month and Year. While the function successfully separated the data, it returned a warning message. After doing some research, I found that adding the argument quiet = TRUE would suppress the warning. Once I included this, I was able to separate the column cleanly without any further warnings.With these updates, I created a new dataset called US_wage_theft.I chose to analyze the findings_start_date because it represents the point at which the Wage and Hour Division first determines whether there is a violation or no violation in a case. This date marks the beginning of the findings phase, where initial conclusions are drawn based on available evidence and analysis.

US_wage_theft <- cleaned_wage_theft %>%
mutate (Date = ymd (findings_start_date), Month = month (findings_start_date), Year = year (findings_start_date))
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `Date = ymd(findings_start_date)`.
Caused by warning:
!  3 failed to parse.

5.What are the date boundaries of the data? #Answer: According to the dataset, the date range starts from 1900-01-07 and ends on 3590-01-01, which both appear to be typos. After manually checking by arranging the dates, I found that 18 rows contain incorrect or misleading date entries. All other dates seem to be accurate. My first two codes does not work because, there are some NA values, and some non-date values.

#Final code:
range(US_wage_theft$Date, na.rm=T)
[1] "1900-01-07" "3590-01-10"
  1. In total, how many years and months of data are in this data set? #Answer: I assume there are some errors in the date data. According to the data source, the period starts from 1985. However, it also includes data from the 1900s and 1960s. Additionally, there are 21 cases without a date. Despite these errors, I consider them minimal and have analyzed the data accordingly. The dataset spans a total of 436 months, from January 1990 to March 2025.

#Process: To find the total number of months and years, I used the count function, which provides month-wise data for each year.

  1. Are there any blank rows in the “case_id” column? #Answer: No, there are no blank or missing values in the “case_id” column. Each row in the dataset contains a valid case ID.

#Process: To ensure data completeness in the main column of the dataset, I checked for any missing values in the “case_id” column using the is.na() function. This function helps identify NA values (i.e., missing data). After applying the check, I confirmed that no rows have missing values in the “case_id” column.

  1. Are there any blank rows in the “trade_nm” (Employer name) column? #Answer: No, the employer/business name is mentioned in all rows. There are no missing values in the “trade_nm” column.

#Process:I used the same is.na() function to check whether any employer names were missing in the “trade_nm” column. The result showed 0 (zero) missing rows, which means no data is missing in this column either.

  1. Are there any blank rows in the “date” column? #Answer: Yes, there are 21 rows where the finding start date is not mentioned.

#Process:I used the same is.na() function to check whether any values were missing in the “date” column. The result showed 21 missing rows, indicating that the start date is not provided in those entries.

  1. Are there any blank rows in the “st_cd” (State name) column? #Answer: Yes, there are 3 rows where the state name of the employer/business is not mentioned.

#Process:I used the same is.na() function to check for missing values in the “st_cd” column. The result showed 3 blank rows, indicating that the state name is not provided in those rows.

  1. How many unique cases are in the data? #Answer: 357,269. This indicates that there are no duplicate case ID numbers in the dataset—all case IDs are unique.

#Process: I wanted to check how many unique case_id exist and whether any case IDs are repeated or duplicated. For that, I used the summarize() function with the n_distinct() code. The result returned the same number of rows as in the dataset, which confirms that all case_id values are unique.

  1. How many unique employers are in the data? #Answer: 298,751. This indicates that many employers appear multiple times for wage violations in different states across the U.S.

#Process:I wanted to check how many unique employers exist in the dataset. For that, I used the summarize() function with the n_distinct() code, similar to the previous question.

#Data analysis: Q1. Which state has the highest number of wage theft cases in the United States, according to Wage and Hour Compliance Action Data? Where does Missouri rank on the list? #Answer: Texas has the highest number, with 45,983 individual cases of Wage and Hour Compliance violations. Missouri ranks 13th on the list, with 7,871 violation cases.

#Process: To identify the state-wise wage theft cases, I used the count() function. Since each case is represented by an individual row, and each row includes a specific state name, I counted the state using the count() function. Then, I arranged the results in descending order to find the state with the highest number of wage theft cases in the U.S.

#However, the problem with the above code is that it does not reflect the actual scenario of wage theft in each state. This is because every state has its own demographic differences, such as population and area size. For example, a state with a larger population is likely to have more businesses, which could naturally result in a higher number of wage theft cases compared to a smaller state. Therefore, to make a fair comparison, I will examine which state has the highest number of wage theft cases per 10,000 people, according to Wage and Hour Compliance Action data.

Q2. Which state has the highest number of wage theft cases per 10,000 people, according to Wage and Hour Compliance Action data. Where does Missouri rank on the list? #Answer:West Virginia, 20 cases in per 10,000 people. Missouri ranks 18th on the list, with around 13 violation cases in per 10,000 people .

#Process: To get the answer for the state with the highest number of wage theft cases per 10,000 people, I needed population data for each U.S. state. For this, I used the tidycensus library. So, the first step was to load that library. Next, I used the get_acs() function, as I was already familiar with it from a weekly class assignment. I used the variable B01003_001, which represents the total population. Since I needed the population of each state, I set geography = “state”, and selected the year 2023, as it’s the most recent data available for that variable. This code gave me a dataset called US_state_population. Now, to calculate wage theft cases per 10,000 people, I started by counting how many times each state appears in the wage theft dataset (specifically in the st_cd column). This count represents the number of cases in each state. Next, I used mutate() to standardize state names in both datasets. In the US_state_population dataset, states are listed by their full names, while in the US_wage_theft dataset, they are represented using abbreviations (e.g., “DC”). To match them, I used the state.name[match()] function and included is.na to avoid potential errors in case of missing matches. After standardizing names, I joined the two datasets using a left join, bringing in both the state name and population estimate. Then, I used mutate() again to calculate the number of cases per 10,000 people by dividing the case count by the total population of each state and multiplying the result by 10,000. Finally, I arranged the result in descending order based on the cases_per_10K value.

Q3. Which state has the highest total number of wage theft violations per 10,000 people, according to Wage and Hour Compliance Action data. Where does Missouri rank on the list? #Answer: Arkansas recorded the highest number of wage theft violations per 10,000 people, with 2,910 cases. Missouri ranks 35th on the list, with 212 violations per 10,000 people.

#Process: To answer this question, I followed a process very similar to the previous one, since the goal was again to calculate state-level violations per 10,000 people. However, this time I needed the total number of violations rather than just the count of entries.First, I grouped the data by state using group_by(state), and then used the summarize() function to calculate the total number of violations for each state. Next, I followed the same procedure to merge the population data using a left join, ensuring the population estimates were matched with each state’s violation data. To calculate violations per 10,000 people, I used the mutate() function. I divided the total number of violations by the population estimate for each state and then multiplied the result by 10,000. Finally, I used arrange(desc(violations_per_10K)) to sort the results in descending order based on the violations per 10,000 people.

Q4. Against which company or business did employees file the highest number of wage theft cases in the United States, according to Wage and Hour Compliance Action Data? #Answer: Subway. There are a total of 1,359 cases across all states in which Subway was found guilty of violating Wage and Hour Compliance.

#Process:During the assessment of the dataset, I found that there are several employers who have multiple cases across the U.S. Many of these employers operate chain businesses in different states. So, while analyzing the national data, I wanted to identify which employers or businesses have the highest number of total cases.To do this, I used the count() function on the employer name (trade_nm), similar to how I counted total cases by state.

#However, the problem with the above code is that it does not reflect the real situation of wage theft in each business. Employers vary in business size and workforce. I can’t fairly compare raw numbers—like total cases or dollars—between a small business like Shakespeare’s Pizza and a large chain like Subway, because Subway operates on a much larger scale. That’s why I chose to measure the average number of affected employees per case instead.

Q5. Which company affected the highest number of employees on average in each wage theft case in the United States, according to Wage and Hour Compliance Action Data? #Answer: Walmart. There are a total of 104 cases across all states involving Walmart, with an average of 848 employees affected per case.

#Process: To find the answer, I first grouped the data by employer (trade_nm). Then, I used the summarize() function. I counted the total number of cases using n(), and added up the number of affected employees using the sum() function on ee_voiltd_cnt, which shows how many employees were affected. After that, I get the average number of affected employees per case by dividing the total number of affected employees by the number of cases. But to keep the results fair, I didn’t include companies that had very few cases. Sometimes a company with just one case and many affected workers could end up at the top of the list. So, I only included companies with more than 50 cases in the U.S. Finally, I sorted the data from highest to lowest based on the average number of affected employees per case to find out which company had the most on average.

Q6. Which company or business committed the highest average number of wage theft violations in the United States, according to Wage and Hour Compliance Action Data? #Answer: Dollar General had the highest average number of violations. The company was involved in 84 cases with a total of 141,139 Wage and Hour Compliance violations. This means, on average, Dollar General committed about 1,680 violations per case.

#Process: Process: Since the number of cases and the number of violations are different, I wanted to find out which employers had the highest number of violations. But just looking at the total number of violations doesn’t show the full picture. For example, Wells Fargo Bank, N.A. had the highest total violations (530,002), but it came from only one case. So, I decided to look at the average number of violations per case. To do this, I grouped the data by trade_nm (employer name), then used the summarize() function to count the total number of cases and total number of violations (case_violtn_cnt). After that, I calculated the average violations per case by dividing total violations by total cases. Finally, I arranged the results in descending order based on the average violations per case. Like in the previous question, to keep the results fair, I didn’t include companies that had very few cases. Sometimes, a company with just one case and many violations could end up at the top of the list, which wouldn’t show the real picture. So, I only included companies that had more than 50 cases across the U.S.

Q7. Which employer/business had to pay the highest amount in back wages to its employees for violating Hour and Wage Compliance across the U.S.? #Answer: Puerto Rico Department of Corrections — $39,950,933.10.

#Process:“Back Wages Agreed to Pay” is an important indicator, as it reflects the financial restitution provided to workers who were victims of wage theft or other labor violations. Therefore, I wanted to find out which employers had to pay the highest amount in back wages.To analyze this, I followed a similar approach as in the previous question. However, this time I summarized the bw_atp_amt (back wages agreed to pay) and arranged the results in descending order. The outcome revealed some new employer names that were not at the top in the previous analysis, indicating that different employers are associated with different types and levels of violations. Furthermore, I wanted to see how many employees were set to receive those back wages. So, I added another sum() function for the ee_atp_cnt indicator, which refers to the total number of employees receiving back wages. This result appeared in a separate column alongside the total back wages.

Q8. Which employer/business had to pay the highest total amount of civil money penalties (CMP) for violating Hour and Wage Compliance across the U.S.? #Answer: The results contain some errors. I am getting the same trade name appearing twice after grouping the data. I couldn’t figure out exactly why this is happening, but I found that there is a problem with the trade name field.

Q9. Which employer/business violated Hour and Wage Compliance against the highest number of employees in the U.S.? #Answer: Walmart. A total of 88,278 employees were affected by Walmart’s violations of Hour and Wage Compliance, which is the highest number in U.S.

#Process: Another important variable in this dataset is ee_violtd_cnt, which refers to the number of employees affected by violations. Using this variable, I wanted to identify which employers affected the highest number of employees across the U.S. To analyze this, I grouped the data by trade_nm (employer name) and summarized the “ee_violtd_cnt” variable. Then, I arranged the results in descending order to highlight the employers with the greatest number of affected employees.

  1. What is the year-wise trend for Wage & Hour Compliance violation cases in the U.S.? #Answer: The year 2010 recorded the highest number of cases, with 24,954. However, the analysis shows that the period from 2009 to 2013 saw the highest yearly case counts for Wage & Hour Compliance violations. The total number of violations varied across these years. For example, in 2012, the total number of cases was comparatively lower among the top five years, but the total number of violations was the highest.

#Process: I wanted to analyze the year-wise trend of total Wage & Hour Compliance violation cases and the total number of violations. To do this, I grouped the data by year and then summarized both the number of cases and the total violations.For the number of cases, I used the count() function with n() to count each case as a single, unique instance. For violations, I used sum() to calculate the total number of violations across all cases for each year. Finally, I arranged the results of total cases in descending order to observe which years had the highest numbers of cases.

Q11. What is the trend in Wage & Hour Compliance violation cases in the U.S. over the last 10 years? #Answer: Wage & Hour Compliance violation cases across the U.S. have been steadily decreasing over the past 10 years. In 2015, the total number of cases was 18,500, which dropped significantly to just 717 in 2024. However, the total number of violations within these cases varied by year. Despite these fluctuations, the number of violations has also shown a downward trend since 2019.

#process: For this question, I followed a similar approach as in the previous questions, but added a filter for specific years. To apply the filter, I used the %in% c() syntax for accurate results.

Q12. Which industry has the highest number of Wage & Hour Compliance cases and violations in the U.S.? How many employees were affected in those industries?

#Answer: I have two answers to this question. If I look at the raw data without considering business size or context, the Restaurant and Hotel industry has the highest number of Wage & Hour Compliance cases. This industry also leads in total violations and the number of affected employees. However, not all industries are equal in size, so comparing total numbers alone may not give the full picture. When I calculate the average number of violations per case, the results change. In that case, Health and Personal Care Stores have the highest average, with about 3,710 violations per case.

#Process (Answer 1 – Total Numbers): To identify industry-wise patterns, I grouped the dataset by naics_code_description, which shows the industry name. After grouping, I summarized three key things: Total number of cases (using n()), Total number of violations (using sum(case_violtn_cnt)), Total affected employees (using sum(ee_voiltd_cnt)). Then, I arranged the results in descending order based on the number of cases to find which industries had the most reported wage and hour violations.

#Process (Answer 2 – Average Violations per Case): For a fairer comparison, I again grouped the data by naics_code_description. I used summarize() to: Count total cases using n(), Sum total violations and affected employees, Calculate the average violations per case by dividing total violations by the case count. To avoid misleading results from industries with very few cases, I filtered for industries with at least 50 cases. Finally, I sorted the data by average violations in descending order.

Q13: Which indicators of Wage & Hour Compliance Action data have the highest total violations? #Answer: Family and Medical Leave Act (FMLA) violation: 6,618,226. Following Service Contract Violation: 480,704.

#Process: Wage & Hour Complince Action data has more than 80 variable, half of those are relate to voilation count. Among them 6 veriable are most impotant to follow accoding to Department of Labor. That why I messure those to answer this question. First, I selected six specific violation-related columns from the dataset: flsa_violtn_cnt (Fair Labor Standards Act violations), mspa_violtn_cnt (Migrant and Seasonal Agricultural Worker Protection Act violations), sca_violtn_cnt (Service Contract Act violations), fmla_violtn_cnt (Family and Medical Leave Act violations), h1b_violtn_cnt (H-1B work visa violations), flsa_cl_violtn_cnt (Child Labor violations under FLSA). Then, I used the summarize() function to calculate the total number of violations under each law. I renamed the output columns for clarity, so each total reflects the respective violation type. However, the way the results were displayed using the previous function made it difficult to measure or analyze the data clearly. Therefore, I wanted to restructure the output by having all violation types listed in one column and their corresponding violation numbers in another column. To achieve this, I used the pivot_longer() function. In my mid-term project, I had used pivot_wider(), so I was already familiar with how the pivot_longer() function works. I applied it here to display the results in a more readable format and then arranged them in descending order for easier comparison and analysis.

Q14: How has the number of major indicators of Wage & Hour Compliance violations varied over the years? #Answer: The results show that every major indicator has decreased significantly over the past ten years. For instance, Fair Labor Standards Violations dropped from 3,550 in 2015 to just 42 in 2024. Service Contract Violation was 22,289 in 2015 and declined to 200 in 2024. Family and Medical Leave Violations decreased from 220,774 to 2,872. Child Labor Violation also saw a reduction, from 3,550 in 2015 to 42 in 2024. This trend indicates substantial improvement in wage and hour compliance over the last decade.

#Process: To analyze year-wise data for each indicator, I first grouped the dataset by year. Since the dataset spans a long period, I filtered it to only include the most recent 10 years using the %in% operator. Then, I used the same code structure from the previous question to summarize violations for six major indicators. I also intended to calculate the negative growth percentage over the ten-year span to show the rate of improvement but was unable to write a code it successfully. Instead, I sorted the summarized data by year to observe the trend.

US_wage_theft %>%
  filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
  group_by(Year) %>%
  select(flsa_violtn_cnt, mspa_violtn_cnt,  sca_violtn_cnt, 
         fmla_violtn_cnt, h1b_violtn_cnt, flsa_cl_violtn_cnt) %>%
  summarize (Fair_Labor_Standards_Violation = sum (flsa_cl_violtn_cnt), 
             Migrant_Agricultural_Protection_Violation = sum (mspa_violtn_cnt), 
             Service_Contract_Violation = sum (sca_violtn_cnt),
             Family_Medical_Leave_Violation = sum (fmla_violtn_cnt), 
             Immigration_Work_Violation = sum (h1b_violtn_cnt), 
             Child_labor_Violation = sum (flsa_cl_violtn_cnt)) %>%
  arrange (Year)
Adding missing grouping variables: `Year`

Q15. How do the top five states that have done the highest violations in per 10,000 people vary in terms of total violations of Wage and Hour Compliance over the last 10 years? #Answer: All five states have seen decreases in violations by 2024. Every state’s total violation was below a 500 last year. Arkansas had the highest violations in 2016 with 456,237 and remained one of the top violators. Tennessee saw two spikes in violations: 266,410 in 2019 and 240,982 in 2021. Alabama had high violations in the early years, especially in 2016 (144,881), then declined. Rhode Island showed consistent mid-to-high violations with a peak in 2020 (1,378). Minnesota had a high violation in 2017 (36,092) but saw a decline afterward.

#Process: To answer this question, I filtered the data by both State and Year, as I needed information for five specific states over the last ten years. From the beginning of my code, I used the %in% operator to select only the relevant states and years.Next, I grouped the data by both Year and State, since I needed the violation numbers for each state across each year. After grouping, I summarized the total number of violations for each combination of year and state. Finally, to present the data clearly in a tabular format, I used the pivot_wider() function to reshape the data—making each state a separate column with years as rows.

US_wage_theft %>%
  filter(st_cd %in% c("AR", "RI", "TN", "MN", "AL")) %>%
  filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
  group_by(Year, st_cd) %>%
  summarize(total_violation = sum(case_violtn_cnt)) %>%
  pivot_wider(names_from = "st_cd", 
              values_from = "total_violation") 
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.

Q16. How have the states varied in terms of total violations of Wage and Hour Compliance over the last 10 years? #Answer: The data does not provide a single, specific answer but rather a table with 10 columns and 57 rows representing different states and territories. However, states with the highest total number of violations also tend to rank high across each year. However, the trend of numbers for each state has been declining.

#Process: To answer this question, I filtered the data by Year, as I needed information for ten specific years. I used the %in% operator to select only the relevant years. Next, I grouped the data by both Year and State, since I needed the violation numbers for each state across filtered year. After grouping, I summarized the total number of violations for each combination of year and state. Finally, to present the data clearly in a tabular format, I used the pivot_wider() function to reshape the data—making each state a separate column with years as rows.

US_wage_theft %>%
  filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
  group_by(Year, st_cd) %>%
  summarize(total_violation = sum(case_violtn_cnt)) %>%
  pivot_wider(names_from = "st_cd", 
              values_from = "total_violation") 
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.

Q17. Which state takes the longest time to complete a finding on average? #Answer: Rhode Island takes the longest time to complete a finding, with an average of 675 days, which is almost two years. The median time to complete a case there is even higher—728 days.

#Process: To find the answer, I first created a new variable in the dataset called Days_to_complete, which I calculated by subtracting findings_start_date from findings_end_date using the as.numeric() function. Next, I arranged the data by Days_to_complete in descending order. However, I found some incorrect values in the dates—some records showed dates like the year 1900 or 3519, which are likely typos. According to the data dictionary, the Wage & Hour Compliance Action Data includes records only from 1985 to the present, so I filtered the data to include only dates between 1985 and 2025. After filtering, I grouped the data by state to see which states took the longest time to complete a case. I then used the summarize() function to calculate both the average (mean) and median number of days to complete a finding. To keep the results realistic and avoid missleading results from states with very few cases, I filtered for states with more than 50 cases.

#Missouri specific dataset:

#Process: After analyzing national percspective from the Wage and Hour Compliance Action Data, I wanted to look into missouri specific data set. Therefore I filter Missouri data only for my further analysis. For that, I use filter funtion and create a new data set called “MO_wage_theft” for furthur analysis.

#Missouri clean dataset #Exclude the columns that contain only zeros in all rows.

#Process: I fllowed this process in national data set as well to exclude the rows those have any data. I used the select() function to choose which columns to keep, combined with where(~!all(. == 0)) to filter out columns where all values are zero. The code ~!all(. == 0), means “keep columns where not all values are zero”. It removes only columns where every single value is zero. The result was stored back in the original dataset called MO_wage_theft with 75 columns, which was 98 for national data set.

MO_wage_theft <- MO_wage_theft %>%
  select(where(~!all(. == 0)))
Error: object 'MO_wage_theft' not found

#Standardize the City Names to All Uppercase Letters #Process: I found that some city names appeared in different formats—for instance, both “Saint Louis” and “SAINT LOUIS” were present. To ensure consistency in my analysis, I standardized all city names to uppercase. To do this, I used the mutate() function along with the toupper() function. The toupper() function converts all text in the cty_nm column to uppercase letters. I updated the original dataset by assigning the result back to the same name: MO_wage_theft.

Q18: Which company/employer in Missouri had the highest record of Wage & Hour Compliance cases and number of violations? #Answer: I have two answers to this question. If I look at the raw data without considering business size or context, Highest number of cases: Subway, with 33 cases. Highest number of violations: George’s Processing, Incorporated, with a total of 3,148 violations across 2 cases. However, not all business are equal in size, so comparing total numbers alone may not give the full picture. When I calculate the average number of violations per case, the results change. In that case, Imo’s Pizza have the highest average, with about 23 violations per case.

#Process 1 (Total Numbers): To get the total number of cases and violation, I used a similar approach in both cases, with only a small difference in the arrangement step. I wanted to present the number of cases and total violations at the same time, but since the employers with the highest case count and highest total violations were different, I wrote two separate code blocks. The codewas simple and similar to what I used for the national-level data. First, I grouped the data by trade_nm (employer name), then summarized it. For the number of cases, I used the n() function to count how many times each employer appeared in the trade_nm column—each appearance represents a case.For the total number of violations, I used the sum() function to calculate the total violation count per employer.

#Process 2 (Average Violations per Case): For a fairer comparison, I again grouped the data by business (trade_nm). I used summarize() to: Count total cases using n(), Sum total violations and affected employees, Calculate the average violations per case by dividing total violations by the case count. To avoid misleading results from business with very few cases, I filtered for business with at least 10 cases. Finally, I sorted the data by average violations in descending order.

Q19: Which company/employer in Missouri had to pay the highest back wages, and how many employees received those back wages from each employer? #Answer: George’s Processing, Incorporated paid a total of $1,245,257.09 to 3,084 employees.

#Process: To find the answer, I grouped the data by employer name (trade_nm). Then, I summarized the data using both bw_atp_amt (which represents back wages paid) and ee_atp_cmt (which represents the number of employees who received those wages). I arranged the summarized data in descending order by total back wages. Since the employer who paid the highest amount also happened to pay the highest number of employees, I didn’t need to write a separate code for employee count—both results could be shown in one table.

Q20: Which employer/business had to pay the highest total amount of Civil Money Penalties (CMP) in Missouri for violating Wage and Hour Compliance? #Answer: Missouri Vegetable Farm paid the highest total amount in civil money penalties, with $384,626.61.

#Process: To find this, I grouped the data by employer name (trade_nm). After that, I summarized the cmp_assd column, which represents the total amount of civil money penalties imposed on employers. Finally, I arranged the results in descending order based on the total CMP amount (cmp_assd) to identify the top violator.

Q21: Which city in Missouri experienced the highest number of cases, highest number of violations, and the most affected employees according to the Wage & Hour Compliance violation data? #Answer: Saint Louis recorded the highest numbers with 1,487 cases, 25,019 total violations, and 21,956 affected employees.

#Process: First, I grouped the data by city name (cty_nm). To answer all three parts of the question together, I used the summarize() function: For the number of cases, I used the n() function. Since each row represents a case, counting how many times a city appears gives the total number of cases. For total violations and affected employees, I used the sum() function on the relevant columns. Finally, I arranged the results in descending order by the number of cases.

Q22: In which year did Missouri experience the highest number of cases, highest number of violations, and the most affected employees according to the Wage & Hour Compliance violation data? #Answer: The highest number of cases was filed in 2009, with 527 cases. The highest number of violations occurred in 2006, with 12,329 violations. That same year (2006), 11,907 employees were affected—the highest recorded.

#Process:The process was similar to the one I used in previous questions. I started by grouping the data by year, then used count() and summarize() to get values for the three variables: number of cases, total violations, and number of affected employees.Since the year with the most cases was different from the year with the most violations and affected employees, I used the same code but arranged the results separately—first by case count, then by total violations—to identify each highest year.

Q23: How has Missouri been experiencing Wage & Hour Compliance cases, violations, and affected employees over the last 10 years? #Answer: Missouri has been experiencing a declining trend in Wage and Hour Compliance violations since 2020. In that year, the total number of cases was 318, which dropped significantly to 6 cases by 2024. Five years ago, the total number of violations was 3,661, and the number of affected employees was 3,066. In 2024, these numbers declined to 88 violations and 60 affected employees, respectively

#Process: To analyze the last 10 years, I filtered the dataset using the %in% operator and listed each of the last ten years explicitly. After filtering, I followed the same approach as in the previous question: I grouped the data by year and then used count() and summarize() to calculate the number of cases, total violations, and affected employees. Finally, I arranged the data in ascending order to get year-wise trends clearly.

Q24. Which industry in Missouri experienced the highest number of cases, the highest number of violations, and the most affected employees according to the Wage & Hour Compliance violation data? #Answer: Full-Service Restaurants recorded the highest numbers with 915 cases, 15,664 total violations, and 12,979 affected employees. In fact top three industries of the table are related to lauiser and hospitality business: Full-Service Restaurants, Limited-Service Restaurants, and Hotels (except Casino Hotels) and Motels.

#Process: First, I grouped the data by industry (naics_code_description). To answer all three parts of the question together, I used the summarize() function: For the number of cases, I used the n() function. Since each row represents a case, counting how many times a industry name appears gives the total number of cases. For total violations and affected employees, I used the sum() function on the relevant columns. Finally, I arranged the results in descending order by the number of cases.

Q25. Which indicators of Wage & Hour Compliance Action data have the highest total violations in Missouri? #Answer: Service_Contract_Violation: 6,208. following Family_Medical_Leave_Violation: 2,455.

#Process: Missouri Wage & Hour Complince data set has 75 variable, half of those are relate to voilation count. Among them 6 veriable are most impotant to follow accoding to Department of Labor. I messured those for national data as well. Those six indicators/veriables are: flsa_violtn_cnt (Fair Labor Standards Act violations), mspa_violtn_cnt (Migrant and Seasonal Agricultural Worker Protection Act violations), sca_violtn_cnt (Service Contract Act violations), fmla_violtn_cnt (Family and Medical Leave Act violations), h1b_violtn_cnt (H-1B work visa violations), flsa_cl_violtn_cnt (Child Labor violations under FLSA). I select those for to show them in my analysis only. Then, I used the summarize() function to calculate the total number of violations under each law. I renamed the output columns for clarity, so each total reflects the respective violation type. However, the way the results were displayed using the previous function made it difficult to measure or analyze the data clearly. Therefore, I wanted to restructure the output by having all violation types listed in one column and their corresponding violation numbers in another column. To achieve this, I used the pivot_longer() function. Then arranged them in descending order for easier comparison and analysis.

Q26: How has the violation number of the 6 major indicators of Wage & Hour Compliance Action data varied over the years in Missouri? #Answer: The results show that all six major indicators have decreased significantly over the past ten years in Missouri. However, some of them experienced increases during the mid-years. For example, during the pandemic in 2020 and 2021, Fair Labor Standards Violations rose to 140, but dropped to 3 by 2024. Service Contract Violations fell from 375 in 2017 to zero in 2024. Child Labor Violations also declined, from 60 in 2015 to 3 in 2024.

#Process: To analyze year-wise data for each indicator, I first grouped the dataset by year. Since the dataset spans a long period, I filtered it to only include the most recent 10 years using the %in% operator. Then, I used the same code structure from the previous question to summarize violations for six major indicators. I also intended to calculate the negative growth percentage over the ten-year span to show the rate of improvement but was unable to write a code it successfully. Instead, I sorted the summarized data by year to observe the trend.

MO_wage_theft %>%
  filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
  group_by(Year) %>%
  select(flsa_violtn_cnt, mspa_violtn_cnt,  sca_violtn_cnt, 
         fmla_violtn_cnt, h1b_violtn_cnt, flsa_cl_violtn_cnt) %>%
  summarize (Fair_Labor_Standards_Violation = sum (flsa_cl_violtn_cnt), 
             Migrant_Agricultural_Protection_Violation = sum (mspa_violtn_cnt), 
             Service_Contract_Violation = sum (sca_violtn_cnt),
             Family_Medical_Leave_Violation = sum (fmla_violtn_cnt), 
             Immigration_Work_Violation = sum (h1b_violtn_cnt), 
             Child_labor_Violation = sum (flsa_cl_violtn_cnt)) %>%
  arrange (Year)
Adding missing grouping variables: `Year`

Q27. How did the top five cities in Missouri with the highest total violations of Wage and Hour Compliance over the last 10 years vary? #Answer: Among the top five cities in Missouri that recorded the highest total violations, SPRINGFIELD, COLUMBIA, INDEPENDENCE did not have any violations of Wage and Hour Compliance in the 2024. All five cities have seen decreases in total violations by 2024 compared to 2015. However, Saint Louis recorded a higher number of violations in 2022 (312) than in the previous year (162). Columbia declined from 556 violations in 2015 to zero for the last two years. Kansas City experienced 2 violations in 2024, down from 957 in 2017. Saint Louis had the highest violations in 2017, with 1,324, and remained the top city. Independence also saw spikes in violations, reaching 1,611 in 2017. Springfield showed consistent mid-to-high violations, with a peak in 2020 (641).

#Process: To answer this question, I filtered the data by both city and year, as I needed information for five specific cities over the last ten years. From the beginning of my code, I used the %in% operator to select only the relevant years and cities. Next, I grouped the data by both year and city, as I needed the violation numbers for each city across each year. After grouping, I summarized the total number of violations for each combination of year and city. Finally, to present the data in a tabular format, I used the pivot_wider() function to reshape the data—making each city a separate column with years as rows.

MO_wage_theft %>%
  filter(Year %in% c(2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024)) %>%
  filter(cty_nm %in% c("SAINT LOUIS", "KANSAS CITY", "SPRINGFIELD", "COLUMBIA", "INDEPENDENCE")) %>%
  group_by(Year, cty_nm) %>%
  summarize(total_violation = sum(case_violtn_cnt)) %>%
  pivot_wider(names_from = "cty_nm", 
              values_from = "total_violation") 
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.

Q28. Which Wage and Hour Compliance violation case in Missouri took the longest time to complete? #Answer: The case number is 1035967. It is against Blue Springs Lawn & Garden from Blue Springs, Missouri. This case took 4,840 days to complete, which is more than 13 years. The findings began on September 26, 1997, and ended on December 27, 2010.

#Process: To find the answer, I first created a new variable in the dataset called Days_to_complete, which I calculated by subtracting findings_start_date from findings_end_date using the as.numeric() function. Next, I filtered the data by state for get only MO data. Finnaly I arrange the data in descending order to find the answer.

Q29. What are the average and median days to complete a Wage and Hour Compliance violation case in Missouri? #Answer: The average number of days to complete a Wage & Hour Compliance violation case in Missouri is 589 days, and the median is 728 days, which is almost two years.

#Process: To find the answer, I first created a new variable in the dataset called Days_to_complete, which I calculated by subtracting findings_start_date from findings_end_date using the as.numeric() function. Next,to calculate the average and median values for the days to complete, I used the summarize function and wrote code to compute both the mean (average) and median. I also added na.rm = TRUE to avoid the NA values in the column. Since the column contained a few NA values, using na.rm = TRUE ensured that the calculation was based only on the available data; otherwise, the result would have been NA.

Q30. In which industry do Wage & Hour Compliance violation cases take the longest median time to complete? And how has the time to complete a case in Missouri changed in the last 10 years?

#Answer: The industry with the longest median time to complete a Wage & Hour Compliance violation case is Technical and Trade Schools. It takes 3,521 days—or about nine and a half years—to close a case in this industry. In Missouri, the median number of days to complete a case has dropped significantly over the last 10 years. In 2015, it was 729 days, but in 2024, it came down to just 146 days.

#Process: To find the median number of days to complete a case by industry, I grouped the dataset by the naics_code_description column, which represents industry names. Then, I used the summarize() function to calculate the median of the Days_to_complete variable. I arranged the results in descending order to identify which industries take the longest time. To analyze Missouri’s trend over the last 10 years, I first filtered the dataset for cases in Missouri and for years 2015 through 2024. Then, I grouped the data by year, used the summarize() function again to find the median completion time each year, and tracked how it changed over time.

Q31. Which employer in Missouri violated the service contract the most, and which industry tops the list for service contract violations? #Answer: The employer that violated the service contract the most in Missouri is Abbott Ambulance, with a total of 1,083 violations. Industry-wise, Tax Preparation Services had the highest number of service contract violations, totaling 920.

#Process: This question has two parts, so I wrote two separate pieces of code. However, both followed a similar structure, with only the grouping variable being different. To find the employer and the industry with the highest service contract violations, I used the group_by() function to group the data accordingly. Then, I used the summarize() function to calculate the total service contract violations. Finally, I arranged the results in descending order based on the number of service contract violations.

Q32. Which employer in Missouri violated the Fair Labor Standards the most, and which industry tops the list for Fair Labor Standards violations? #Answer: The employer that violated the Fair Labor Standards Act the most in Missouri is Dog Days Bar and Grill, with a total of 41 violations. Industry-wise, Full-Service Restaurants had the highest number of Fair Labor Standards violations, totaling 375.

#Process: This question has two parts, similar to the previous one. The only difference is that the main variable this time is Fair Labor Standards. I summarized the data in both pieces of code by grouping first by employer and then by industry name. Finally, I arranged the results by the Fair Labor Standards violation count in decending order.

Q33. Which employer in Missouri violated the Family and Medical Leave Act the most, and which industry tops the list for Family and Medical Leave Act violations? #Answer: The employer that violated the Family and Medical Leave Act the most in Missouri is West County Care Center, with a total of 1,380 violations. Industry-wise, Nursing Care Facilities had the highest number of Family and Medical Leave Act violations, totaling 1,421.

#Process: This question is similar to the previous two. Therefore, I followed almost the same process to answer this question, with the only change being the variable related to the Family and Medical Leave Act.

Q34. Which employer in Missouri violated the Child Labor Act the most, and which industry and city top the list for Child Labor Act violations? #Answer: The employer that violated the Child Labor Act the most in Missouri is Dog Days Bar and Grill, with a total of 41 violations. Industry-wise, Full-Service Restaurants had the highest number of Child Labor Act violations, totaling 375. The city with the highest number of Child Labor Act violations is SPRINGFIELD, with 133 incidents.

#Process: This question is similar to the previous three, but this time I also included city as an additional factor to identify which city in Missouri experienced the most Child Labor violations. To answer all three parts of the question, I followed the same general process—grouping the data by employer, industry, and city—then summarizing the total number of Child Labor violations. The only change was using the variable related to Child_labor_Violation.

Q35. Which employer/business in Missouri violated all six major indicators of Wage and Hours Compliance? #Answer: None.

#Process: To get the answer, I used the filter function. As I needed to find trade names of businesses that had violations in all six categories, I filtered for rows that had values greater than zero in all six columns (since zero means no violation). I wanted to see if any company had violations in all six categories, which is why I filtered using >0 for each variable. Finally, I selected the trade_nm column so that if any employer had violations in all six categories, their trade name would appear.

LS0tCnRpdGxlOiAiU2F1cmF2IFJhaG1hbl9maW5hbF9wcm9qZWN0X0FESjI1IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojU3VtbWFyeSAoTmF0aW9uYWwpOiBBY2NvcmRpbmcgdG8gdGhlIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gZGF0YSwgVGV4YXMgaGFzIHRoZSBoaWdoZXN0IG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzLCB3aXRoIDQ1LDk4MyBpbmRpdmlkdWFsIGNhc2VzLCB3aGlsZSBGbG9yaWRhIGhhcyB0aGUgaGlnaGVzdCB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucywgd2l0aCAxLDE4NSwwNTQgdmlvbGF0aW9ucyBhY3Jvc3MgMjksMDQ2IGNhc2VzLiBXaGVuIGFkanVzdGVkIGZvciBwb3B1bGF0aW9uLCBXZXN0IFZpcmdpbmlhIGhhcyB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygd2FnZSB0aGVmdCBjYXNlcyBwZXIgMTAsMDAwIHBlb3BsZSwgd2l0aCAyMCBjYXNlcyBwZXIgMTAsMDAwIHJlc2lkZW50cy4gTWlzc291cmkgcmFua3MgMTh0aCBvbiB0aGlzIGxpc3QsIHdpdGggYXJvdW5kIDEzIGNhc2VzIHBlciAxMCwwMDAgcGVvcGxlLiBJbiB0ZXJtcyBvZiB2aW9sYXRpb25zIHBlciAxMCwwMDAgcGVvcGxlLCBBcmthbnNhcyByYW5rcyBmaXJzdCB3aXRoIDIsOTEwIHZpb2xhdGlvbnMsIHdoaWxlIE1pc3NvdXJpIHJhbmtzIDM1dGgsIHdpdGggMjEyIHZpb2xhdGlvbnMgcGVyIDEwLDAwMCBwZW9wbGUuIEFtb25nIGNvbXBhbmllcywgU3Vid2F5IGhhcyB0aGUgbW9zdCB3YWdlIHRoZWZ0IGNhc2VzIGZpbGVkIGFnYWluc3QgaXQsIHRvdGFsaW5nIDEsMzU5IGNhc2VzLiBXZWxscyBGYXJnbyBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHZpb2xhdGlvbnMsIHdpdGggNTMwLDAwMiB2aW9sYXRpb25z4oCUYWx0aG91Z2ggYWxsIGZyb20gYSBzaW5nbGUgY2FzZS4gV2FsbWFydCBoYXMgdGhlIGhpZ2hlc3QgYXZlcmFnZSBudW1iZXIgb2YgYWZmZWN0ZWQgZW1wbG95ZWVzIHBlciBjYXNlLCB3aXRoIDEwNCBjYXNlcyBhY3Jvc3MgYWxsIHN0YXRlcyBhbmQgYW4gYXZlcmFnZSBvZiA4NDggZW1wbG95ZWVzIGFmZmVjdGVkIHBlciBjYXNlLCB0b3RhbGluZyA4OCwyNzggd29ya2Vycy4gRG9sbGFyIEdlbmVyYWwgaGFkIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgbnVtYmVyIG9mIHZpb2xhdGlvbnMgcGVyIGNhc2UuIFRoZSBjb21wYW55IHdhcyBpbnZvbHZlZCBpbiA4NCBjYXNlcyB3aXRoIGEgdG90YWwgb2YgMTQxLDEzOSB2aW9sYXRpb25zLCB3aGljaCBtZWFucyBpdCBjb21taXR0ZWQgYWJvdXQgMSw2ODAgdmlvbGF0aW9ucyBwZXIgY2FzZSBvbiBhdmVyYWdlLiBUaGUgUHVlcnRvIFJpY28gRGVwYXJ0bWVudCBvZiBDb3JyZWN0aW9ucyB3YXMgcmVxdWlyZWQgdG8gcGF5IHRoZSBoaWdoZXN0IGFtb3VudCBpbiBiYWNrIHdhZ2Vz4oCUJDM5LDk1MCw5MzMuMTAuIEluZHVzdHJ5LXdpc2UsIHRoZSByZXN0YXVyYW50IGFuZCBob3RlbCBpbmR1c3RyeSBoYXMgdGhlIGhpZ2hlc3QgdG90YWwgbnVtYmVyIG9mIHdhZ2UgdGhlZnQgdmlvbGF0aW9ucy4gSG93ZXZlciwgaW4gdGVybXMgb2YgYXZlcmFnZSB2aW9sYXRpb25zIHBlciBjYXNlLCBIZWFsdGggYW5kIFBlcnNvbmFsIENhcmUgU3RvcmVzIHJhbmsgaGlnaGVzdCwgd2l0aCBhYm91dCAzLDcxMCB2aW9sYXRpb25zIHBlciBjYXNlLiBPdmVyIHRoZSBsYXN0IDEwIHllYXJzLCBib3RoIHRoZSBudW1iZXIgb2Ygd2FnZSB0aGVmdCBjYXNlcyBhbmQgdmlvbGF0aW9ucyBoYXZlIGRlY2xpbmVkLCBzdWdnZXN0aW5nIHBvc3NpYmxlIGltcHJvdmVtZW504oCUZXNwZWNpYWxseSB3aXRoIHRoZSBlbmZvcmNlbWVudCBvZiBsYXdzIGxpa2UgdGhlIEZhbWlseSBhbmQgTWVkaWNhbCBMZWF2ZSBBY3QgKEZNTEEpIGFuZCBjaGlsZCBsYWJvciBwcm90ZWN0aW9ucy4gUmhvZGUgSXNsYW5kIHRha2VzIHRoZSBsb25nZXN0IHRpbWUgdG8gY29tcGxldGUgYSBjYXNlLCB3aXRoIGFuIGF2ZXJhZ2Ugb2YgNjc1IGRheXMsIHdoaWNoIGlzIGFsbW9zdCB0d28geWVhcnMuIFRoZSBtZWRpYW4gdGltZSB0byBjb21wbGV0ZSBhIGNhc2UgdGhlcmUgaXMgZXZlbiBoaWdoZXLigJQ3MjggZGF5cy4KCiNQcm9qZWN0IGlkZWE6IE5hdmlnYXRpbmcgV2FnZSBUaGVmdCBpbiBBbWVyaWNhCiNEZXRhaWxzOiBDcmVhdGUgYSBpbnRlcmFjdGl2ZSBwb3J0YWwgd2hlcmUgcGVvcGxlIGV4cGxvcmUgZGVjYWRlLWxvbmcgdHJlbmRzIGluIHdhZ2UgdGhlZnQgYnkgc3RhdGUsIGluZHVzdHJ5LCBlbXBsb3llciBhbmQgYWxsIG90aGVyIHJlbGF0ZWQgaW5mb3JtYXRpb24uIAoKI1N0b3J5IGlkZWE6CiMxLiBXYWdlIHRoZWZ0IGNhc2VzIGFyZSBnb2luZyBkb3du4oCUYnV0IHdoeT8gCkFuIGFuYWx5c2lzIG9mIHdoeSB3YWdlIHRoZWZ0IGlzIGhhcHBlbmluZyBsZXNzIG9mdGVuIG5vdyBhbmQgaWYgdGhhdOKAmXMgcmVhbGx5IGEgZ29vZCBzaWduLgojMi4gV29ya2VycyBpbiBIZWFsdGggYW5kIFBlcnNvbmFsIENhcmUgU3RvcmVzIGZhY2VzIHRoZSBtb3N0IHdhZ2UgdGhlZnQuCldoeSBhbmQgaG93IHBlb3BsZSBpbiB0aGUgSGVhbHRoIGFuZCBQZXJzb25hbCBDYXJlIFN0b3JlcyBhcmUgdGhlIG1vc3QgbGlrZWx5IHRvIGJlIGFmZmVjdGVkIGJ5IHdhZ2UgdGhlZnQuCiMzLiBXaHkgV2VzdCBWaXJnaW5pYSBhbmQgQXJrYW5zYXMgaGF2ZSB0aGUgbW9zdCB3YWdlIHRoZWZ0IGluIHBlciAxMCwwMDAgcG9wdWxhdGlvbj8KQW4gaW52ZXN0aWdhdGl2ZSBsb29rIGF0IHdoeSB0aGVzZSB0d28gc3RhdGVzIGhhdmUgbW9yZSB3YWdlIHRoZWZ0IHRoYW4gb3RoZXJzLgojNC4gV2h5IGRvZXMgUmhvZGUgSXNsYW5kIHRha2UgdGhlIGxvbmdlc3QgdGltZSB0byBjb25jbHVkZSBhIHdhZ2UgdGhlZnQgY2FzZT8KRXhwbG9yZSB0aGUgcmVhc29ucyBiZWhpbmQgUmhvZGUgSXNsYW5kJ3MgdW51c3VhbGx5IGxvbmcgYXZlcmFnZSBjYXNlIGR1cmF0aW9uIGZvciByZXNvbHZpbmcgd2FnZSB0aGVmdC4KCiNTdW1tYXJ5IChNaXNzb3VyaSk6IEluIE1pc3NvdXJpLCBHZW9yZ2UncyBQcm9jZXNzaW5nLCBJbmNvcnBvcmF0ZWQgaGFkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbnMsIHdpdGggMywxNDggdmlvbGF0aW9ucyBhY3Jvc3MgMiBjYXNlcy4gVGhlIGNvbXBhbnkgYWxzbyBwYWlkIHRoZSBoaWdoZXN0IGFtb3VudCBpbiBiYWNrIHdhZ2Vz4oCUJDEsMjQ1LDI1Ny4wOeKAlHRvIDMsMDg0IGVtcGxveWVlcy4gSXQgYWZmZWN0ZWQgdGhlIG1vc3Qgd29ya2VycyBpbiB0aGUgc3RhdGUsIHdpdGggYSB0b3RhbCBvZiAzLDE0NyBlbXBsb3llZXMgaW1wYWN0ZWQuIEhvd2V2ZXIsIHNpbmNlIGJ1c2luZXNzZXMgdmFyeSBpbiBzaXplLCBjb21wYXJpbmcgdG90YWwgbnVtYmVycyBhbG9uZSBtYXkgbm90IHByb3ZpZGUgYSBjb21wbGV0ZSBwaWN0dXJlLiBXaGVuIGxvb2tpbmcgYXQgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHZpb2xhdGlvbnMgcGVyIGNhc2UsIHRoZSByZXN1bHRzIGRpZmZlcuKAlCBJbW8ncyBQaXp6YSBoYWQgdGhlIGhpZ2hlc3QgYXZlcmFnZSwgd2l0aCBhYm91dCAyMyB2aW9sYXRpb25zIHBlciBjYXNlLiBNaXNzb3VyaSBWZWdldGFibGUgRmFybSBwYWlkIHRoZSBoaWdoZXN0IGNpdmlsIG1vbmV5IHBlbmFsdGllcywgdG90YWxpbmcgJDM4NCw2MjYuNjEuIFRoZSBjaXR5IG9mIFN0LiBMb3VpcyByZWNvcmRlZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgY2FzZXMsIHZpb2xhdGlvbnMsIGFuZCBhZmZlY3RlZCBlbXBsb3llZXMgaW4gTWlzc291cmksIHdpdGggMSw0ODcgY2FzZXMsIDI1LDAxOSB2aW9sYXRpb25zLCBhbmQgMjEsOTU2IGFmZmVjdGVkIGVtcGxveWVlcywgcmVzcGVjdGl2ZWx5LiBPdmVyIHRoZSBwYXN0IDEwIHllYXJzLCBNaXNzb3VyaSBoYXMgc2VlbiBhIGRlY2xpbmUgaW4gd2FnZSBhbmQgaG91ciB2aW9sYXRpb25zLCB3aXRoIGNhc2VzIGRyb3BwaW5nIGZyb20gMzE4IGluIDIwMjAgdG8ganVzdCA2IGluIDIwMjQuIFRoZSBhdmVyYWdlIHRpbWUgdG8gcmVzb2x2ZSBhIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgY2FzZSBpbiBNaXNzb3VyaSBpcyA1ODkgZGF5cywgd2hpbGUgdGhlIG1lZGlhbiB0aW1lIGlzIDcyOCBkYXlz4oCUYWJvdXQgdHdvIHllYXJzLiBPbmUgY2FzZSwgaW52b2x2aW5nIEJsdWUgU3ByaW5ncyBMYXduICYgR2FyZGVuLCB0b29rIDQsODQwIGRheXPigJRtb3JlIHRoYW4gMTMgeWVhcnPigJR0byBjb21wbGV0ZS4KCiNTdG9yeSBpZGVhOgojMTogTWlzc291cmnigJlzIGRlY2xpbmluZyB3YWdlIHRoZWZ0IHRyZW5kcwpBbmFseXppbmcgdGhlIGRlY2xpbmUgaW4gd2FnZSB0aGVmdCB2aW9sYXRpb25zIGluIE1pc3NvdXJpIG92ZXIgdGhlIGxhc3QgZGVjYWRlLCBmcm9tIDMxOCBjYXNlcyBpbiAyMDIwIHRvIGp1c3QgNiBpbiAyMDI0LiBXaGF04oCZcyBkcml2aW5nIHRoaXMgcG9zaXRpdmUgdHJlbmQsIGFuZCB3aGF04oCZcyBzdGlsbCBiZWluZyBtaXNzZWQ/CiMyLiBXYWdlIHRoZWZ0IGluIFNhaW50IExvdWlzIHRoZSBoaWdoZXN0IHZpb2xhdGlvbnMgaW4gTWlzc291cmkKQSBmb2N1cyBvbiBTYWludCBMb3Vpcywgd2hpY2ggcmVjb3JkZWQgMSw0ODcgY2FzZXMgYW5kIDI1LDAxOSB2aW9sYXRpb25zLiBUaGlzIHN0b3J5IHdvdWxkIGV4cGxvcmUgdGhlIGltcGFjdCBvbiB3b3JrZXJzIGFuZCB3aGF0IGlzIGJlaW5nIGRvbmUgdG8gYWRkcmVzcyB0aGUgcHJvYmxlbS4KIzMuIFdoeSBkaWQgdGhlIHdhZ2UgdGhlZnQgY2FzZSBhZ2FpbnN0IEJsdWUgU3ByaW5ncyBMYXduICYgR2FyZGVuIGluIEJsdWUgU3ByaW5ncywgTWlzc291cmksIHRha2UgbW9yZSB0aGFuIDEzIHllYXJzIHRvIGNvbXBsZXRlPwpJbnZlc3RpZ2F0ZSB0aGUgdGhlIHVudXN1YWxseSBsb25nIGR1cmF0aW9uIHRvIGNvbXBsZXRlIHRoZSBjYXNlLiAKCiNMb2FkIGxpYnJhcnkKYGBge3J9CgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmBgYAojTG9hZCBkYXRhCiNQcm9jZXNzOiBJIGltcG9ydGVkIHRoZSBkYXRhIHdpdGggdGhlIG5hbWUgIndhZ2VfdGhlZnQiIHVzaW5nIHRoZSAicmVhZF9jc3YiIGNvZGUuCmBgYHtyfQoKd2FnZV90aGVmdCA8LSByZWFkX2NzdigiZGF0YS93aGRfd2hpc2FyZC5jc3YiKQoKYGBgCiNEYXRhIGFzc2VzbWVudDogCiNHZXQgdG8ga25vdyB0aGUgZGF0YS8gRGF0YSBkaWN0aW9uYXJ5OgoxLiBIb3cgbWFueSByb3dzPwojQW5zd2VyOiAzNTcsMjY5IHJvd3MKCjIuIFdoYXQgaXMgb25lIHJvdz8tIAojQW5zd2VyOiBFYWNoIHJvdyByZXByZXNlbnRzIGEgc2luZ2xlLCBjb25jbHVkZWQgY29tcGxpYW5jZSBhY3Rpb24gKGludmVzdGlnYXRpb24gb3IgY2FzZSkgY29uZHVjdGVkIGJ5IHRoZSBEZXBhcnRtZW50IG9mIExhYm9yIGF0IGEgc3BlY2lmaWMgZW1wbG95ZXIuIAoKMy4gSG93IG1hbnkgY29sdW1uPy0gCiNBbnN3ZXI6IEluaXRpYWxseSwgdGhlIGRhdGFzZXQgY29udGFpbmVkIDExMCBjb2x1bW5zLiBIb3dldmVyLCBzZXZlcmFsIGNvbHVtbnMgY29udGFpbmVkIG9ubHkgemVybyB2YWx1ZXMgYW5kIG5vIG1lYW5pbmdmdWwgZGF0YSwgc28gSSBleGNsdWRlZCB0aG9zZS4gQWZ0ZXIgcmVtb3ZpbmcgdGhlc2UgY29sdW1ucywgdGhlIG51bWJlciBvZiBjb2x1bW5zIHdhcyByZWR1Y2VkIHRvIDk0LiBOZXh0LCBJIGV4dHJhY3RlZCB0aGUgJ2ZpbmRpbmdfc3RhcnRfZGF0ZScgY29sdW1uIGludG8gc2VwYXJhdGUgY29sdW1ucyBmb3IgRGF0ZSwgTW9udGgsIGFuZCBZZWFyIHRvIGVuYWJsZSBtb3JlIGRldGFpbGVkIHRpbWUtYmFzZWQgYW5hbHlzaXMuIFRoaXMgdHJhbnNmb3JtYXRpb24gaW5jcmVhc2VkIHRoZSB0b3RhbCBudW1iZXIgb2YgY29sdW1ucyB0byA5Nywgd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlIG5ldyAnRGF0ZScsICdNb250aCcsIGFuZCAnWWVhcicgY29sdW1ucy4gCgo0LiBXaGF0IGlzIGluIGV2ZXJ5IGNvbHVtbj8KI0Fuc3dlcjogVGhlIGRhdGEgc2V0IGJlZ2lucyB3aXRoIHRoZSBjYXNlIElELCBmb2xsb3dlZCBieSB0aGUgZW1wbG95ZXLigJlzIG5hbWUsIGFkZHJlc3MsIGFuZCB0aGUgY2FzZSBzdGFydCBhbmQgZW5kIGRhdGVzLiBJbiBhZGRpdGlvbiB0byB0aGVzZSBkZW1vZ3JhcGhpYyBkZXRhaWxzLCB0aGVyZSBhcmUgbmVhcmx5IDEwMCBjb2x1bW5zIGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBudW1iZXIgb2YgdmlvbGF0aW9ucywgYmFjayB3YWdlIGFtb3VudHMsIGFuZCBmaW5lcy4gRnJvbSB0aGVzZSwgdGhlIDIwIG1vc3QgcmVsZXZhbnQgaW5kaWNhdG9ycyB3aWxsIGJlIHNlbGVjdGVkIGZvciBhbmFseXNpcy4KCiNFeGNsdWRlIHRoZSBjb2x1bW5zIHRoYXQgY29udGFpbiBvbmx5IHplcm9zIGluIGFsbCByb3dzLgoKI1Byb2Nlc3M6IEkgdXNlZCB0aGUgc2VsZWN0KCkgZnVuY3Rpb24gdG8gY2hvb3NlIHdoaWNoIGNvbHVtbnMgdG8ga2VlcCwgY29tYmluZWQgd2l0aCB3aGVyZSh+IWFsbCguID09IDApKSB0byBmaWx0ZXIgb3V0IGNvbHVtbnMgd2hlcmUgYWxsIHZhbHVlcyBhcmUgemVyby4gVGhlIGNvZGUgfiFhbGwoLiA9PSAwKSwgbWVhbnMgImtlZXAgY29sdW1ucyB3aGVyZSBub3QgYWxsIHZhbHVlcyBhcmUgemVybyIuIEl0IHJlbW92ZXMgb25seSBjb2x1bW5zIHdoZXJlIGV2ZXJ5IHNpbmdsZSB2YWx1ZSBpcyB6ZXJvLiBUaGUgcmVzdWx0IHdhcyBzdG9yZWQgYmFjayBpbiB0aGUgb3JpZ2luYWwgZGF0YXNldCBjYWxsZWQgTU9fd2FnZV90aGVmdC4KYGBge3J9CgpjbGVhbmVkX3dhZ2VfdGhlZnQgPC0gd2FnZV90aGVmdCAlPiUKICBzZWxlY3Qod2hlcmUofiFhbGwoLiA9PSAwKSkpCgpgYGAKCgojUHJvY2VzczogQXQgdGhpcyBwb2ludCBpbiBteSBhbmFseXNpcywgSSB3YW50ZWQgdG8gc2VwYXJhdGUgdGhlIG1vbnRoIGFuZCB5ZWFyIGZyb20gdGhlIGZpbmRpbmdzX3N0YXJ0X2RhdGUgY29sdW1uIHRvIHBlcmZvcm0gdGltZS1iYXNlZCBhbmFseXNpcy4gSW5pdGlhbGx5LCBJIHVzZWQgdGhlIG1keSgpIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGZpbmRpbmdzX3N0YXJ0X2RhdGUgaW50byBzZXBhcmF0ZSBEYXRlLCBNb250aCwgYW5kIFllYXIgY29tcG9uZW50cy4gSG93ZXZlciwgSSByZWFsaXplZCB0aGF0IHRoZSBhY3R1YWwgZGF0ZSBmb3JtYXQgd2FzICJ5bWQiLCBzbyBJIHN3aXRjaGVkIHRvIHVzaW5nIHRoZSB5bWQoKSBmdW5jdGlvbiB0byBwcm9wZXJseSBleHRyYWN0IHRoZSBNb250aCBhbmQgWWVhci4gV2hpbGUgdGhlIGZ1bmN0aW9uIHN1Y2Nlc3NmdWxseSBzZXBhcmF0ZWQgdGhlIGRhdGEsIGl0IHJldHVybmVkIGEgd2FybmluZyBtZXNzYWdlLiBBZnRlciBkb2luZyBzb21lIHJlc2VhcmNoLCBJIGZvdW5kIHRoYXQgYWRkaW5nIHRoZSBhcmd1bWVudCBxdWlldCA9IFRSVUUgd291bGQgc3VwcHJlc3MgdGhlIHdhcm5pbmcuIE9uY2UgSSBpbmNsdWRlZCB0aGlzLCBJIHdhcyBhYmxlIHRvIHNlcGFyYXRlIHRoZSBjb2x1bW4gY2xlYW5seSB3aXRob3V0IGFueSBmdXJ0aGVyIHdhcm5pbmdzLldpdGggdGhlc2UgdXBkYXRlcywgSSBjcmVhdGVkIGEgbmV3IGRhdGFzZXQgY2FsbGVkIFVTX3dhZ2VfdGhlZnQuSSBjaG9zZSB0byBhbmFseXplIHRoZSBmaW5kaW5nc19zdGFydF9kYXRlIGJlY2F1c2UgaXQgcmVwcmVzZW50cyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIFdhZ2UgYW5kIEhvdXIgRGl2aXNpb24gZmlyc3QgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXJlIGlzIGEgdmlvbGF0aW9uIG9yIG5vIHZpb2xhdGlvbiBpbiBhIGNhc2UuIFRoaXMgZGF0ZSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaW5kaW5ncyBwaGFzZSwgd2hlcmUgaW5pdGlhbCBjb25jbHVzaW9ucyBhcmUgZHJhd24gYmFzZWQgb24gYXZhaWxhYmxlIGV2aWRlbmNlIGFuZCBhbmFseXNpcy4KYGBge3J9CgpVU193YWdlX3RoZWZ0IDwtIGNsZWFuZWRfd2FnZV90aGVmdCAlPiUKICBtdXRhdGUoCiAgICBEYXRlID0geW1kKGZpbmRpbmdzX3N0YXJ0X2RhdGUsIHF1aWV0ID0gVFJVRSksCiAgICBNb250aCA9IG1vbnRoKHltZChmaW5kaW5nc19zdGFydF9kYXRlLCBxdWlldCA9IFRSVUUpKSwKICAgIFllYXIgPSB5ZWFyKHltZChmaW5kaW5nc19zdGFydF9kYXRlLCBxdWlldCA9IFRSVUUpKSkKCmBgYAoKNS5XaGF0IGFyZSB0aGUgZGF0ZSBib3VuZGFyaWVzIG9mIHRoZSBkYXRhPyAKI0Fuc3dlcjogQWNjb3JkaW5nIHRvIHRoZSBkYXRhc2V0LCB0aGUgZGF0ZSByYW5nZSBzdGFydHMgZnJvbSAxOTAwLTAxLTA3IGFuZCBlbmRzIG9uIDM1OTAtMDEtMDEsIHdoaWNoIGJvdGggYXBwZWFyIHRvIGJlIHR5cG9zLiBBZnRlciBtYW51YWxseSBjaGVja2luZyBieSBhcnJhbmdpbmcgdGhlIGRhdGVzLCBJIGZvdW5kIHRoYXQgMTggcm93cyBjb250YWluIGluY29ycmVjdCBvciBtaXNsZWFkaW5nIGRhdGUgZW50cmllcy4gQWxsIG90aGVyIGRhdGVzIHNlZW0gdG8gYmUgYWNjdXJhdGUuIE15IGZpcnN0IHR3byBjb2RlcyBkb2VzIG5vdCB3b3JrIGJlY2F1c2UsIHRoZXJlIGFyZSBzb21lIE5BIHZhbHVlcywgYW5kIHNvbWUgbm9uLWRhdGUgdmFsdWVzLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lIAogIG11dGF0ZShEYXRlID0gbWR5IChEYXRlKSwgbmEucm0gPSBUUlVFKSAlPiUgCiAgc3VtbWFyaXNlKHJhbmdlKERhdGUpKQoKVVNfd2FnZV90aGVmdCAlPiUgCiAgbXV0YXRlKERhdGUgPSB5bWQgKERhdGUpKSAlPiUgCiAgc3VtbWFyaXNlKHJhbmdlKERhdGUpKQoKI0ZpbmFsIGNvZGU6CnJhbmdlKFVTX3dhZ2VfdGhlZnQkRGF0ZSwgbmEucm09VCkKYGBgCgo2LiBJbiB0b3RhbCwgaG93IG1hbnkgeWVhcnMgYW5kIG1vbnRocyBvZiBkYXRhIGFyZSBpbiB0aGlzIGRhdGEgc2V0PwojQW5zd2VyOiBJIGFzc3VtZSB0aGVyZSBhcmUgc29tZSBlcnJvcnMgaW4gdGhlIGRhdGUgZGF0YS4gQWNjb3JkaW5nIHRvIHRoZSBkYXRhIHNvdXJjZSwgdGhlIHBlcmlvZCBzdGFydHMgZnJvbSAxOTg1LiBIb3dldmVyLCBpdCBhbHNvIGluY2x1ZGVzIGRhdGEgZnJvbSB0aGUgMTkwMHMgYW5kIDE5NjBzLiBBZGRpdGlvbmFsbHksIHRoZXJlIGFyZSAyMSBjYXNlcyB3aXRob3V0IGEgZGF0ZS4gRGVzcGl0ZSB0aGVzZSBlcnJvcnMsIEkgY29uc2lkZXIgdGhlbSBtaW5pbWFsIGFuZCBoYXZlIGFuYWx5emVkIHRoZSBkYXRhIGFjY29yZGluZ2x5LiBUaGUgZGF0YXNldCBzcGFucyBhIHRvdGFsIG9mIDQzNiBtb250aHMsIGZyb20gSmFudWFyeSAxOTkwIHRvIE1hcmNoIDIwMjUuCgojUHJvY2VzczogVG8gZmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIG1vbnRocyBhbmQgeWVhcnMsIEkgdXNlZCB0aGUgY291bnQgZnVuY3Rpb24sIHdoaWNoIHByb3ZpZGVzIG1vbnRoLXdpc2UgZGF0YSBmb3IgZWFjaCB5ZWFyLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lIAogIGNvdW50KFllYXIsIE1vbnRoKQoKYGBgCgo3LiBBcmUgdGhlcmUgYW55IGJsYW5rIHJvd3MgaW4gdGhlICJjYXNlX2lkIiBjb2x1bW4/CiNBbnN3ZXI6IE5vLCB0aGVyZSBhcmUgbm8gYmxhbmsgb3IgbWlzc2luZyB2YWx1ZXMgaW4gdGhlICJjYXNlX2lkIiBjb2x1bW4uIEVhY2ggcm93IGluIHRoZSBkYXRhc2V0IGNvbnRhaW5zIGEgdmFsaWQgY2FzZSBJRC4KCiNQcm9jZXNzOiBUbyBlbnN1cmUgZGF0YSBjb21wbGV0ZW5lc3MgaW4gdGhlIG1haW4gY29sdW1uIG9mIHRoZSBkYXRhc2V0LCBJIGNoZWNrZWQgZm9yIGFueSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgImNhc2VfaWQiIGNvbHVtbiB1c2luZyB0aGUgaXMubmEoKSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBoZWxwcyBpZGVudGlmeSBOQSB2YWx1ZXMgKGkuZS4sIG1pc3NpbmcgZGF0YSkuIEFmdGVyIGFwcGx5aW5nIHRoZSBjaGVjaywgSSBjb25maXJtZWQgdGhhdCBubyByb3dzIGhhdmUgbWlzc2luZyB2YWx1ZXMgaW4gdGhlICJjYXNlX2lkIiBjb2x1bW4uCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoaXMubmEoY2FzZV9pZCkgfCBjYXNlX2lkID09ICIiKQoKYGBgCgo4LiBBcmUgdGhlcmUgYW55IGJsYW5rIHJvd3MgaW4gdGhlICJ0cmFkZV9ubSIgKEVtcGxveWVyIG5hbWUpIGNvbHVtbj8KI0Fuc3dlcjogTm8sIHRoZSBlbXBsb3llci9idXNpbmVzcyBuYW1lIGlzIG1lbnRpb25lZCBpbiBhbGwgcm93cy4gVGhlcmUgYXJlIG5vIG1pc3NpbmcgdmFsdWVzIGluIHRoZSAidHJhZGVfbm0iIGNvbHVtbi4KCiNQcm9jZXNzOkkgdXNlZCB0aGUgc2FtZSBpcy5uYSgpIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgYW55IGVtcGxveWVyIG5hbWVzIHdlcmUgbWlzc2luZyBpbiB0aGUgInRyYWRlX25tIiBjb2x1bW4uIFRoZSByZXN1bHQgc2hvd2VkIDAgKHplcm8pIG1pc3Npbmcgcm93cywgd2hpY2ggbWVhbnMgbm8gZGF0YSBpcyBtaXNzaW5nIGluIHRoaXMgY29sdW1uIGVpdGhlci4KYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihpcy5uYSh0cmFkZV9ubSkgfCB0cmFkZV9ubSA9PSAiIikKCmBgYAoKOS4gQXJlIHRoZXJlIGFueSBibGFuayByb3dzIGluIHRoZSAiZGF0ZSIgY29sdW1uPwojQW5zd2VyOiBZZXMsIHRoZXJlIGFyZSAyMSByb3dzIHdoZXJlIHRoZSBmaW5kaW5nIHN0YXJ0IGRhdGUgaXMgbm90IG1lbnRpb25lZC4KCiNQcm9jZXNzOkkgdXNlZCB0aGUgc2FtZSBpcy5uYSgpIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgYW55IHZhbHVlcyB3ZXJlIG1pc3NpbmcgaW4gdGhlICJkYXRlIiBjb2x1bW4uIFRoZSByZXN1bHQgc2hvd2VkIDIxIG1pc3Npbmcgcm93cywgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGFydCBkYXRlIGlzIG5vdCBwcm92aWRlZCBpbiB0aG9zZSBlbnRyaWVzLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgZmlsdGVyKGlzLm5hKERhdGUpIHwgRGF0ZSA9PSAiIikKCmBgYAoKMTAuIEFyZSB0aGVyZSBhbnkgYmxhbmsgcm93cyBpbiB0aGUgInN0X2NkIiAoU3RhdGUgbmFtZSkgY29sdW1uPwojQW5zd2VyOiBZZXMsIHRoZXJlIGFyZSAzIHJvd3Mgd2hlcmUgdGhlIHN0YXRlIG5hbWUgb2YgdGhlIGVtcGxveWVyL2J1c2luZXNzIGlzIG5vdCBtZW50aW9uZWQuCgojUHJvY2VzczpJIHVzZWQgdGhlIHNhbWUgaXMubmEoKSBmdW5jdGlvbiB0byBjaGVjayBmb3IgbWlzc2luZyB2YWx1ZXMgaW4gdGhlICJzdF9jZCIgY29sdW1uLiBUaGUgcmVzdWx0IHNob3dlZCAzIGJsYW5rIHJvd3MsIGluZGljYXRpbmcgdGhhdCB0aGUgc3RhdGUgbmFtZSBpcyBub3QgcHJvdmlkZWQgaW4gdGhvc2Ugcm93cy4KYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihpcy5uYShzdF9jZCkgfCBzdF9jZCA9PSAiIikKCmBgYAoKMTEuIEhvdyBtYW55IHVuaXF1ZSBjYXNlcyBhcmUgaW4gdGhlIGRhdGE/CiNBbnN3ZXI6IDM1NywyNjkuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBjYXNlIElEIG51bWJlcnMgaW4gdGhlIGRhdGFzZXTigJRhbGwgY2FzZSBJRHMgYXJlIHVuaXF1ZS4KCiNQcm9jZXNzOiBJIHdhbnRlZCB0byBjaGVjayBob3cgbWFueSB1bmlxdWUgY2FzZV9pZCBleGlzdCBhbmQgd2hldGhlciBhbnkgY2FzZSBJRHMgYXJlIHJlcGVhdGVkIG9yIGR1cGxpY2F0ZWQuIEZvciB0aGF0LCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uIHdpdGggdGhlIG5fZGlzdGluY3QoKSBjb2RlLiBUaGUgcmVzdWx0IHJldHVybmVkIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIGluIHRoZSBkYXRhc2V0LCB3aGljaCBjb25maXJtcyB0aGF0IGFsbCBjYXNlX2lkIHZhbHVlcyBhcmUgdW5pcXVlLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgc3VtbWFyaXNlKGNhc2VfaWQgPSBuX2Rpc3RpbmN0KGNhc2VfaWQpKQoKYGBgCgoxMi4gSG93IG1hbnkgdW5pcXVlIGVtcGxveWVycyBhcmUgaW4gdGhlIGRhdGE/CiNBbnN3ZXI6IDI5OCw3NTEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgbWFueSBlbXBsb3llcnMgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGZvciB3YWdlIHZpb2xhdGlvbnMgaW4gZGlmZmVyZW50IHN0YXRlcyBhY3Jvc3MgdGhlIFUuUy4KCiNQcm9jZXNzOkkgd2FudGVkIHRvIGNoZWNrIGhvdyBtYW55IHVuaXF1ZSBlbXBsb3llcnMgZXhpc3QgaW4gdGhlIGRhdGFzZXQuIEZvciB0aGF0LCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uIHdpdGggdGhlIG5fZGlzdGluY3QoKSBjb2RlLCBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBxdWVzdGlvbi4gCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBzdW1tYXJpc2UoVW5pcXVlX0VtcGxveWVyID0gbl9kaXN0aW5jdCh0cmFkZV9ubSkpCgpgYGAKCiNEYXRhIGFuYWx5c2lzOgpRMS4gV2hpY2ggc3RhdGUgaGFzIHRoZSBoaWdoZXN0IG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBhY2NvcmRpbmcgdG8gV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBEYXRhPyBXaGVyZSBkb2VzIE1pc3NvdXJpIHJhbmsgb24gdGhlIGxpc3Q/CiNBbnN3ZXI6IFRleGFzIGhhcyB0aGUgaGlnaGVzdCBudW1iZXIsIHdpdGggNDUsOTgzIGluZGl2aWR1YWwgY2FzZXMgb2YgV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbnMuIE1pc3NvdXJpIHJhbmtzIDEzdGggb24gdGhlIGxpc3QsIHdpdGggNyw4NzEgdmlvbGF0aW9uIGNhc2VzLgoKI1Byb2Nlc3M6IFRvIGlkZW50aWZ5IHRoZSBzdGF0ZS13aXNlIHdhZ2UgdGhlZnQgY2FzZXMsIEkgdXNlZCB0aGUgY291bnQoKSBmdW5jdGlvbi4gU2luY2UgZWFjaCBjYXNlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGluZGl2aWR1YWwgcm93LCBhbmQgZWFjaCByb3cgaW5jbHVkZXMgYSBzcGVjaWZpYyBzdGF0ZSBuYW1lLCBJIGNvdW50ZWQgdGhlIHN0YXRlIHVzaW5nIHRoZSBjb3VudCgpIGZ1bmN0aW9uLiBUaGVuLCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgdG8gZmluZCB0aGUgc3RhdGUgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygd2FnZSB0aGVmdCBjYXNlcyBpbiB0aGUgVS5TLiAKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGNvdW50KHN0X2NkKSAlPiUKICBhcnJhbmdlIChkZXNjIChuKSkKCmBgYAoKI0hvd2V2ZXIsIHRoZSBwcm9ibGVtIHdpdGggdGhlIGFib3ZlIGNvZGUgaXMgdGhhdCBpdCBkb2VzIG5vdCByZWZsZWN0IHRoZSBhY3R1YWwgc2NlbmFyaW8gb2Ygd2FnZSB0aGVmdCBpbiBlYWNoIHN0YXRlLiBUaGlzIGlzIGJlY2F1c2UgZXZlcnkgc3RhdGUgaGFzIGl0cyBvd24gZGVtb2dyYXBoaWMgZGlmZmVyZW5jZXMsIHN1Y2ggYXMgcG9wdWxhdGlvbiBhbmQgYXJlYSBzaXplLiBGb3IgZXhhbXBsZSwgYSBzdGF0ZSB3aXRoIGEgbGFyZ2VyIHBvcHVsYXRpb24gaXMgbGlrZWx5IHRvIGhhdmUgbW9yZSBidXNpbmVzc2VzLCB3aGljaCBjb3VsZCBuYXR1cmFsbHkgcmVzdWx0IGluIGEgaGlnaGVyIG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzIGNvbXBhcmVkIHRvIGEgc21hbGxlciBzdGF0ZS4gVGhlcmVmb3JlLCB0byBtYWtlIGEgZmFpciBjb21wYXJpc29uLCBJIHdpbGwgZXhhbWluZSB3aGljaCBzdGF0ZSBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHdhZ2UgdGhlZnQgY2FzZXMgcGVyIDEwLDAwMCBwZW9wbGUsIGFjY29yZGluZyB0byBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UgQWN0aW9uIGRhdGEuCgpRMi4gV2hpY2ggc3RhdGUgaGFzIHRoZSBoaWdoZXN0IG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzIHBlciAxMCwwMDAgcGVvcGxlLCBhY2NvcmRpbmcgdG8gV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBkYXRhLiBXaGVyZSBkb2VzIE1pc3NvdXJpIHJhbmsgb24gdGhlIGxpc3Q/CiNBbnN3ZXI6V2VzdCBWaXJnaW5pYSwgMjAgY2FzZXMgaW4gcGVyIDEwLDAwMCBwZW9wbGUuIE1pc3NvdXJpIHJhbmtzIDE4dGggb24gdGhlIGxpc3QsIHdpdGggYXJvdW5kIDEzIHZpb2xhdGlvbiBjYXNlcyBpbiBwZXIgMTAsMDAwIHBlb3BsZSAuIAoKI1Byb2Nlc3M6IFRvIGdldCB0aGUgYW5zd2VyIGZvciB0aGUgc3RhdGUgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygd2FnZSB0aGVmdCBjYXNlcyBwZXIgMTAsMDAwIHBlb3BsZSwgSSBuZWVkZWQgcG9wdWxhdGlvbiBkYXRhIGZvciBlYWNoIFUuUy4gc3RhdGUuIEZvciB0aGlzLCBJIHVzZWQgdGhlIHRpZHljZW5zdXMgbGlicmFyeS4gU28sIHRoZSBmaXJzdCBzdGVwIHdhcyB0byBsb2FkIHRoYXQgbGlicmFyeS4gTmV4dCwgSSB1c2VkIHRoZSBnZXRfYWNzKCkgZnVuY3Rpb24sIGFzIEkgd2FzIGFscmVhZHkgZmFtaWxpYXIgd2l0aCBpdCBmcm9tIGEgd2Vla2x5IGNsYXNzIGFzc2lnbm1lbnQuIEkgdXNlZCB0aGUgdmFyaWFibGUgQjAxMDAzXzAwMSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgdG90YWwgcG9wdWxhdGlvbi4gU2luY2UgSSBuZWVkZWQgdGhlIHBvcHVsYXRpb24gb2YgZWFjaCBzdGF0ZSwgSSBzZXQgZ2VvZ3JhcGh5ID0gInN0YXRlIiwgYW5kIHNlbGVjdGVkIHRoZSB5ZWFyIDIwMjMsIGFzIGl0J3MgdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGZvciB0aGF0IHZhcmlhYmxlLiBUaGlzIGNvZGUgZ2F2ZSBtZSBhIGRhdGFzZXQgY2FsbGVkIFVTX3N0YXRlX3BvcHVsYXRpb24uIE5vdywgdG8gY2FsY3VsYXRlIHdhZ2UgdGhlZnQgY2FzZXMgcGVyIDEwLDAwMCBwZW9wbGUsIEkgc3RhcnRlZCBieSBjb3VudGluZyBob3cgbWFueSB0aW1lcyBlYWNoIHN0YXRlIGFwcGVhcnMgaW4gdGhlIHdhZ2UgdGhlZnQgZGF0YXNldCAoc3BlY2lmaWNhbGx5IGluIHRoZSBzdF9jZCBjb2x1bW4pLiBUaGlzIGNvdW50IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBjYXNlcyBpbiBlYWNoIHN0YXRlLiBOZXh0LCBJIHVzZWQgbXV0YXRlKCkgdG8gc3RhbmRhcmRpemUgc3RhdGUgbmFtZXMgaW4gYm90aCBkYXRhc2V0cy4gSW4gdGhlIFVTX3N0YXRlX3BvcHVsYXRpb24gZGF0YXNldCwgc3RhdGVzIGFyZSBsaXN0ZWQgYnkgdGhlaXIgZnVsbCBuYW1lcywgd2hpbGUgaW4gdGhlIFVTX3dhZ2VfdGhlZnQgZGF0YXNldCwgdGhleSBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgYWJicmV2aWF0aW9ucyAoZS5nLiwgIkRDIikuIFRvIG1hdGNoIHRoZW0sIEkgdXNlZCB0aGUgc3RhdGUubmFtZVttYXRjaCgpXSBmdW5jdGlvbiBhbmQgaW5jbHVkZWQgaXMubmEgdG8gYXZvaWQgcG90ZW50aWFsIGVycm9ycyBpbiBjYXNlIG9mIG1pc3NpbmcgbWF0Y2hlcy4gQWZ0ZXIgc3RhbmRhcmRpemluZyBuYW1lcywgSSBqb2luZWQgdGhlIHR3byBkYXRhc2V0cyB1c2luZyBhIGxlZnQgam9pbiwgYnJpbmdpbmcgaW4gYm90aCB0aGUgc3RhdGUgbmFtZSBhbmQgcG9wdWxhdGlvbiBlc3RpbWF0ZS4gVGhlbiwgSSB1c2VkIG11dGF0ZSgpIGFnYWluIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNhc2VzIHBlciAxMCwwMDAgcGVvcGxlIGJ5IGRpdmlkaW5nIHRoZSBjYXNlIGNvdW50IGJ5IHRoZSB0b3RhbCBwb3B1bGF0aW9uIG9mIGVhY2ggc3RhdGUgYW5kIG11bHRpcGx5aW5nIHRoZSByZXN1bHQgYnkgMTAsMDAwLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSByZXN1bHQgaW4gZGVzY2VuZGluZyBvcmRlciBiYXNlZCBvbiB0aGUgY2FzZXNfcGVyXzEwSyB2YWx1ZS4KYGBge3J9CiNsb2FkIHRoZSBsaWJyYXJ5CmxpYnJhcnkodGlkeWNlbnN1cykKClVTX3N0YXRlX3BvcHVsYXRpb24gPC0gZ2V0X2FjcygKICBnZW9ncmFwaHkgPSAic3RhdGUiLAogIHZhcmlhYmxlcyA9ICJCMDEwMDNfMDAxIiwgCiAgeWVhciA9IDIwMjMpCgpVU193YWdlX3RoZWZ0ICU+JQogIGNvdW50KHN0X2NkKSAlPiUKICBtdXRhdGUoc3RhdGUgPSBzdGF0ZS5uYW1lW21hdGNoKHN0X2NkLCBzdGF0ZS5hYmIpXSwKICAgIHN0YXRlID0gY2FzZV93aGVuKHN0X2NkID09ICJEQyIgfiAiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLAogICAgICAhaXMubmEoc3RhdGUpIH4gc3RhdGUsCiAgICAgIFRSVUUgfiBzdF9jZCkpICU+JQogIGxlZnRfam9pbihVU19zdGF0ZV9wb3B1bGF0aW9uICU+JSBzZWxlY3QoTkFNRSwgZXN0aW1hdGUpLCBieSA9IGMoInN0YXRlIiA9ICJOQU1FIikpICU+JQogIG11dGF0ZShjYXNlc19wZXJfMTBrID0gKG4gLyBlc3RpbWF0ZSkgKiAxMDAwMCkgJT4lCiAgYXJyYW5nZShkZXNjKGNhc2VzX3Blcl8xMGspKQoKYGBgCgpRMy4gV2hpY2ggc3RhdGUgaGFzIHRoZSBoaWdoZXN0IHRvdGFsIG51bWJlciBvZiB3YWdlIHRoZWZ0IHZpb2xhdGlvbnMgcGVyIDEwLDAwMCBwZW9wbGUsIGFjY29yZGluZyB0byBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UgQWN0aW9uIGRhdGEuIFdoZXJlIGRvZXMgTWlzc291cmkgcmFuayBvbiB0aGUgbGlzdD8KI0Fuc3dlcjogIEFya2Fuc2FzIHJlY29yZGVkIHRoZSBoaWdoZXN0IG51bWJlciBvZiB3YWdlIHRoZWZ0IHZpb2xhdGlvbnMgcGVyIDEwLDAwMCBwZW9wbGUsIHdpdGggMiw5MTAgY2FzZXMuIE1pc3NvdXJpIHJhbmtzIDM1dGggb24gdGhlIGxpc3QsIHdpdGggMjEyIHZpb2xhdGlvbnMgcGVyIDEwLDAwMCBwZW9wbGUuCgojUHJvY2VzczogVG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIEkgZm9sbG93ZWQgYSBwcm9jZXNzIHZlcnkgc2ltaWxhciB0byB0aGUgcHJldmlvdXMgb25lLCBzaW5jZSB0aGUgZ29hbCB3YXMgYWdhaW4gdG8gY2FsY3VsYXRlIHN0YXRlLWxldmVsIHZpb2xhdGlvbnMgcGVyIDEwLDAwMCBwZW9wbGUuIEhvd2V2ZXIsIHRoaXMgdGltZSBJIG5lZWRlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgcmF0aGVyIHRoYW4ganVzdCB0aGUgY291bnQgb2YgZW50cmllcy5GaXJzdCwgSSBncm91cGVkIHRoZSBkYXRhIGJ5IHN0YXRlIHVzaW5nIGdyb3VwX2J5KHN0YXRlKSwgYW5kIHRoZW4gdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyBmb3IgZWFjaCBzdGF0ZS4gTmV4dCwgSSBmb2xsb3dlZCB0aGUgc2FtZSBwcm9jZWR1cmUgdG8gbWVyZ2UgdGhlIHBvcHVsYXRpb24gZGF0YSB1c2luZyBhIGxlZnQgam9pbiwgZW5zdXJpbmcgdGhlIHBvcHVsYXRpb24gZXN0aW1hdGVzIHdlcmUgbWF0Y2hlZCB3aXRoIGVhY2ggc3RhdGUncyB2aW9sYXRpb24gZGF0YS4gVG8gY2FsY3VsYXRlIHZpb2xhdGlvbnMgcGVyIDEwLDAwMCBwZW9wbGUsIEkgdXNlZCB0aGUgbXV0YXRlKCkgZnVuY3Rpb24uIEkgZGl2aWRlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgYnkgdGhlIHBvcHVsYXRpb24gZXN0aW1hdGUgZm9yIGVhY2ggc3RhdGUgYW5kIHRoZW4gbXVsdGlwbGllZCB0aGUgcmVzdWx0IGJ5IDEwLDAwMC4gRmluYWxseSwgSSB1c2VkIGFycmFuZ2UoZGVzYyh2aW9sYXRpb25zX3Blcl8xMEspKSB0byBzb3J0IHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYmFzZWQgb24gdGhlIHZpb2xhdGlvbnMgcGVyIDEwLDAwMCBwZW9wbGUuIApgYGB7cn0KCgpVU193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHN0X2NkKSAlPiUKICBzdW1tYXJpc2UoVG90YWxfVmlvbGF0aW9uID0gc3VtKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIG11dGF0ZShzdGF0ZSA9IHN0YXRlLm5hbWVbbWF0Y2goc3RfY2QsIHN0YXRlLmFiYildLAogIHN0YXRlID0gY2FzZV93aGVuKHN0X2NkID09ICJEQyIgfiAiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLCFpcy5uYShzdGF0ZSkgfiBzdGF0ZSwgVFJVRSB+IHN0X2NkKSkgJT4lCiAgbGVmdF9qb2luKFVTX3N0YXRlX3BvcHVsYXRpb24gJT4lIHNlbGVjdChOQU1FLCBlc3RpbWF0ZSksIGJ5ID0gYygic3RhdGUiID0gIk5BTUUiKSkgJT4lCiAgbXV0YXRlKHZpb2xhdGlvbnNfcGVyXzEwayA9IChUb3RhbF9WaW9sYXRpb24gLyBlc3RpbWF0ZSkgKiAxMDAwMCkgJT4lCiAgYXJyYW5nZShkZXNjKHZpb2xhdGlvbnNfcGVyXzEwaykpCgpgYGAKClE0LiBBZ2FpbnN0IHdoaWNoIGNvbXBhbnkgb3IgYnVzaW5lc3MgZGlkIGVtcGxveWVlcyBmaWxlIHRoZSBoaWdoZXN0IG51bWJlciBvZiB3YWdlIHRoZWZ0IGNhc2VzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBhY2NvcmRpbmcgdG8gV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBEYXRhPwojQW5zd2VyOiBTdWJ3YXkuIFRoZXJlIGFyZSBhIHRvdGFsIG9mIDEsMzU5IGNhc2VzIGFjcm9zcyBhbGwgc3RhdGVzIGluIHdoaWNoIFN1YndheSB3YXMgZm91bmQgZ3VpbHR5IG9mIHZpb2xhdGluZyBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UuCgojUHJvY2VzczpEdXJpbmcgdGhlIGFzc2Vzc21lbnQgb2YgdGhlIGRhdGFzZXQsIEkgZm91bmQgdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbCBlbXBsb3llcnMgd2hvIGhhdmUgbXVsdGlwbGUgY2FzZXMgYWNyb3NzIHRoZSBVLlMuIE1hbnkgb2YgdGhlc2UgZW1wbG95ZXJzIG9wZXJhdGUgY2hhaW4gYnVzaW5lc3NlcyBpbiBkaWZmZXJlbnQgc3RhdGVzLiBTbywgd2hpbGUgYW5hbHl6aW5nIHRoZSBuYXRpb25hbCBkYXRhLCBJIHdhbnRlZCB0byBpZGVudGlmeSB3aGljaCBlbXBsb3llcnMgb3IgYnVzaW5lc3NlcyBoYXZlIHRoZSBoaWdoZXN0IG51bWJlciBvZiB0b3RhbCBjYXNlcy5UbyBkbyB0aGlzLCBJIHVzZWQgdGhlIGNvdW50KCkgZnVuY3Rpb24gb24gdGhlIGVtcGxveWVyIG5hbWUgKHRyYWRlX25tKSwgc2ltaWxhciB0byBob3cgSSBjb3VudGVkIHRvdGFsIGNhc2VzIGJ5IHN0YXRlLgoKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGNvdW50KHRyYWRlX25tKSAlPiUKICBhcnJhbmdlIChkZXNjIChuKSkKClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkodHJhZGVfbm0pICU+JQogIHN1bW1hcml6ZShjb3VudCA9IG4oKSwKICAgIHRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bShlZV92aW9sdGRfY250KSkgJT4lCiAgICBhcnJhbmdlKGRlc2MoY291bnQpKQoKYGBgCgojSG93ZXZlciwgdGhlIHByb2JsZW0gd2l0aCB0aGUgYWJvdmUgY29kZSBpcyB0aGF0IGl0IGRvZXMgbm90IHJlZmxlY3QgdGhlIHJlYWwgc2l0dWF0aW9uIG9mIHdhZ2UgdGhlZnQgaW4gZWFjaCBidXNpbmVzcy4gRW1wbG95ZXJzIHZhcnkgaW4gYnVzaW5lc3Mgc2l6ZSBhbmQgd29ya2ZvcmNlLiBJIGNhbid0IGZhaXJseSBjb21wYXJlIHJhdyBudW1iZXJz4oCUbGlrZSB0b3RhbCBjYXNlcyBvciBkb2xsYXJz4oCUYmV0d2VlbiBhIHNtYWxsIGJ1c2luZXNzIGxpa2UgU2hha2VzcGVhcmUncyBQaXp6YSBhbmQgYSBsYXJnZSBjaGFpbiBsaWtlIFN1YndheSwgYmVjYXVzZSBTdWJ3YXkgb3BlcmF0ZXMgb24gYSBtdWNoIGxhcmdlciBzY2FsZS4gVGhhdOKAmXMgd2h5IEkgY2hvc2UgdG8gbWVhc3VyZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYWZmZWN0ZWQgZW1wbG95ZWVzIHBlciBjYXNlIGluc3RlYWQuIAoKUTUuIFdoaWNoIGNvbXBhbnkgYWZmZWN0ZWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGVtcGxveWVlcyBvbiBhdmVyYWdlIGluIGVhY2ggd2FnZSB0aGVmdCBjYXNlIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBhY2NvcmRpbmcgdG8gV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBEYXRhPwojQW5zd2VyOiBXYWxtYXJ0LiBUaGVyZSBhcmUgYSB0b3RhbCBvZiAxMDQgY2FzZXMgYWNyb3NzIGFsbCBzdGF0ZXMgaW52b2x2aW5nIFdhbG1hcnQsIHdpdGggYW4gYXZlcmFnZSBvZiA4NDggZW1wbG95ZWVzIGFmZmVjdGVkIHBlciBjYXNlLiAKCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZmlyc3QgZ3JvdXBlZCB0aGUgZGF0YSBieSBlbXBsb3llciAodHJhZGVfbm0pLiBUaGVuLCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uLiBJIGNvdW50ZWQgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcyB1c2luZyBuKCksIGFuZCBhZGRlZCB1cCB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIGVtcGxveWVlcyB1c2luZyB0aGUgc3VtKCkgZnVuY3Rpb24gb24gZWVfdm9pbHRkX2NudCwgd2hpY2ggc2hvd3MgaG93IG1hbnkgZW1wbG95ZWVzIHdlcmUgYWZmZWN0ZWQuIEFmdGVyIHRoYXQsIEkgZ2V0IHRoZSBhdmVyYWdlIG51bWJlciBvZiBhZmZlY3RlZCBlbXBsb3llZXMgcGVyIGNhc2UgYnkgZGl2aWRpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBhZmZlY3RlZCBlbXBsb3llZXMgYnkgdGhlIG51bWJlciBvZiBjYXNlcy4gQnV0IHRvIGtlZXAgdGhlIHJlc3VsdHMgZmFpciwgSSBkaWRu4oCZdCBpbmNsdWRlIGNvbXBhbmllcyB0aGF0IGhhZCB2ZXJ5IGZldyBjYXNlcy4gU29tZXRpbWVzIGEgY29tcGFueSB3aXRoIGp1c3Qgb25lIGNhc2UgYW5kIG1hbnkgYWZmZWN0ZWQgd29ya2VycyBjb3VsZCBlbmQgdXAgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdC4gU28sIEkgb25seSBpbmNsdWRlZCBjb21wYW5pZXMgd2l0aCBtb3JlIHRoYW4gNTAgY2FzZXMgaW4gdGhlIFUuUy4gRmluYWxseSwgSSBzb3J0ZWQgdGhlIGRhdGEgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCBiYXNlZCBvbiB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYWZmZWN0ZWQgZW1wbG95ZWVzIHBlciBjYXNlIHRvIGZpbmQgb3V0IHdoaWNoIGNvbXBhbnkgaGFkIHRoZSBtb3N0IG9uIGF2ZXJhZ2UuICAKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUoY2FzZV9jb3VudCA9IG4oKSwKICAgIHRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bShlZV92aW9sdGRfY250KSwKICAgIGF2Z19hZmZlY3RlZF9wZXJfY2FzZSA9IHRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyAvIGNhc2VfY291bnQpICU+JQogIGZpbHRlcihjYXNlX2NvdW50ID49IDUwKSAlPiUgCiAgICBhcnJhbmdlKGRlc2MoYXZnX2FmZmVjdGVkX3Blcl9jYXNlKSkKCmBgYAoKClE2LiBXaGljaCBjb21wYW55IG9yIGJ1c2luZXNzIGNvbW1pdHRlZCB0aGUgaGlnaGVzdCBhdmVyYWdlIG51bWJlciBvZiB3YWdlIHRoZWZ0IHZpb2xhdGlvbnMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGFjY29yZGluZyB0byBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UgQWN0aW9uIERhdGE/CiNBbnN3ZXI6IERvbGxhciBHZW5lcmFsIGhhZCB0aGUgaGlnaGVzdCBhdmVyYWdlIG51bWJlciBvZiB2aW9sYXRpb25zLiBUaGUgY29tcGFueSB3YXMgaW52b2x2ZWQgaW4gODQgY2FzZXMgd2l0aCBhIHRvdGFsIG9mIDE0MSwxMzkgV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbnMuIFRoaXMgbWVhbnMsIG9uIGF2ZXJhZ2UsIERvbGxhciBHZW5lcmFsIGNvbW1pdHRlZCBhYm91dCAxLDY4MCB2aW9sYXRpb25zIHBlciBjYXNlLgoKI1Byb2Nlc3M6IFByb2Nlc3M6IFNpbmNlIHRoZSBudW1iZXIgb2YgY2FzZXMgYW5kIHRoZSBudW1iZXIgb2YgdmlvbGF0aW9ucyBhcmUgZGlmZmVyZW50LCBJIHdhbnRlZCB0byBmaW5kIG91dCB3aGljaCBlbXBsb3llcnMgaGFkIHRoZSBoaWdoZXN0IG51bWJlciBvZiB2aW9sYXRpb25zLiBCdXQganVzdCBsb29raW5nIGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyBkb2VzbuKAmXQgc2hvdyB0aGUgZnVsbCBwaWN0dXJlLiBGb3IgZXhhbXBsZSwgV2VsbHMgRmFyZ28gQmFuaywgTi5BLiBoYWQgdGhlIGhpZ2hlc3QgdG90YWwgdmlvbGF0aW9ucyAoNTMwLDAwMiksIGJ1dCBpdCBjYW1lIGZyb20gb25seSBvbmUgY2FzZS4gU28sIEkgZGVjaWRlZCB0byBsb29rIGF0IHRoZSBhdmVyYWdlIG51bWJlciBvZiB2aW9sYXRpb25zIHBlciBjYXNlLiBUbyBkbyB0aGlzLCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgdHJhZGVfbm0gKGVtcGxveWVyIG5hbWUpLCB0aGVuIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uIHRvIGNvdW50IHRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgYW5kIHRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zIChjYXNlX3Zpb2x0bl9jbnQpLiBBZnRlciB0aGF0LCBJIGNhbGN1bGF0ZWQgdGhlIGF2ZXJhZ2UgdmlvbGF0aW9ucyBwZXIgY2FzZSBieSBkaXZpZGluZyB0b3RhbCB2aW9sYXRpb25zIGJ5IHRvdGFsIGNhc2VzLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYmFzZWQgb24gdGhlIGF2ZXJhZ2UgdmlvbGF0aW9ucyBwZXIgY2FzZS4gTGlrZSBpbiB0aGUgcHJldmlvdXMgcXVlc3Rpb24sIHRvIGtlZXAgdGhlIHJlc3VsdHMgZmFpciwgSSBkaWRu4oCZdCBpbmNsdWRlIGNvbXBhbmllcyB0aGF0IGhhZCB2ZXJ5IGZldyBjYXNlcy4gU29tZXRpbWVzLCBhIGNvbXBhbnkgd2l0aCBqdXN0IG9uZSBjYXNlIGFuZCBtYW55IHZpb2xhdGlvbnMgY291bGQgZW5kIHVwIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QsIHdoaWNoIHdvdWxkbuKAmXQgc2hvdyB0aGUgcmVhbCBwaWN0dXJlLiBTbywgSSBvbmx5IGluY2x1ZGVkIGNvbXBhbmllcyB0aGF0IGhhZCBtb3JlIHRoYW4gNTAgY2FzZXMgYWNyb3NzIHRoZSBVLlMuCmBgYHtyfQoKI1RoZSBjb2RlIGJlbG93IHJldHVybnMgV2VsbHMgRmFyZ28gQmFuaywgTi5BLiBhcyBhIHJlc3VsdCwgYnV0IHRoZSBjb21wYW55IGhhcyBvbmx5IG9uZSBjYXNlLiBUaGVyZWZvcmUsIGl0IGRvZXMgbm90IHJlZmxlY3QgdGhlIGFjdHVhbCBzY2VuYXJpby4KVVNfd2FnZV90aGVmdCAlPiUKICBncm91cF9ieSh0cmFkZV9ubSkgJT4lCiAgc3VtbWFyaXNlIChjYXNlX2NvdW50ID0gbigpLCAKICAgICAgICAgICAgIFRvdGFsX1Zpb2xhdGlvbiA9IHN1bSAoY2FzZV92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAoVG90YWxfVmlvbGF0aW9uKSkKCiNGaW5hbCBjb2RlIGZvciBhY3R1YWwgc2NlbmFyaW86IApVU193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpc2UgKGNhc2VfY291bnQgPSBuKCksIAogICAgICAgICAgICAgVG90YWxfVmlvbGF0aW9uID0gc3VtIChjYXNlX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIEF2Z192aW9sYXRpb24gPSBUb3RhbF9WaW9sYXRpb24gLyBjYXNlX2NvdW50KSAlPiUKICBmaWx0ZXIoY2FzZV9jb3VudCA+PSA1MCkgJT4lIAogIGFycmFuZ2UgKGRlc2MgKEF2Z192aW9sYXRpb24pKQoKYGBgCgpRNy4gV2hpY2ggZW1wbG95ZXIvYnVzaW5lc3MgaGFkIHRvIHBheSB0aGUgaGlnaGVzdCBhbW91bnQgaW4gYmFjayB3YWdlcyB0byBpdHMgZW1wbG95ZWVzIGZvciB2aW9sYXRpbmcgSG91ciBhbmQgV2FnZSBDb21wbGlhbmNlIGFjcm9zcyB0aGUgVS5TLj8KI0Fuc3dlcjogUHVlcnRvIFJpY28gRGVwYXJ0bWVudCBvZiBDb3JyZWN0aW9ucyDigJQgJDM5LDk1MCw5MzMuMTAuCgojUHJvY2VzczoiQmFjayBXYWdlcyBBZ3JlZWQgdG8gUGF5IiBpcyBhbiBpbXBvcnRhbnQgaW5kaWNhdG9yLCBhcyBpdCByZWZsZWN0cyB0aGUgZmluYW5jaWFsIHJlc3RpdHV0aW9uIHByb3ZpZGVkIHRvIHdvcmtlcnMgd2hvIHdlcmUgdmljdGltcyBvZiB3YWdlIHRoZWZ0IG9yIG90aGVyIGxhYm9yIHZpb2xhdGlvbnMuIFRoZXJlZm9yZSwgSSB3YW50ZWQgdG8gZmluZCBvdXQgd2hpY2ggZW1wbG95ZXJzIGhhZCB0byBwYXkgdGhlIGhpZ2hlc3QgYW1vdW50IGluIGJhY2sgd2FnZXMuVG8gYW5hbHl6ZSB0aGlzLCBJIGZvbGxvd2VkIGEgc2ltaWxhciBhcHByb2FjaCBhcyBpbiB0aGUgcHJldmlvdXMgcXVlc3Rpb24uIEhvd2V2ZXIsIHRoaXMgdGltZSBJIHN1bW1hcml6ZWQgdGhlIGJ3X2F0cF9hbXQgKGJhY2sgd2FnZXMgYWdyZWVkIHRvIHBheSkgYW5kIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIuIFRoZSBvdXRjb21lIHJldmVhbGVkIHNvbWUgbmV3IGVtcGxveWVyIG5hbWVzIHRoYXQgd2VyZSBub3QgYXQgdGhlIHRvcCBpbiB0aGUgcHJldmlvdXMgYW5hbHlzaXMsIGluZGljYXRpbmcgdGhhdCBkaWZmZXJlbnQgZW1wbG95ZXJzIGFyZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHR5cGVzIGFuZCBsZXZlbHMgb2YgdmlvbGF0aW9ucy4gRnVydGhlcm1vcmUsIEkgd2FudGVkIHRvIHNlZSBob3cgbWFueSBlbXBsb3llZXMgd2VyZSBzZXQgdG8gcmVjZWl2ZSB0aG9zZSBiYWNrIHdhZ2VzLiBTbywgSSBhZGRlZCBhbm90aGVyIHN1bSgpIGZ1bmN0aW9uIGZvciB0aGUgZWVfYXRwX2NudCBpbmRpY2F0b3IsIHdoaWNoIHJlZmVycyB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGVtcGxveWVlcyByZWNlaXZpbmcgYmFjayB3YWdlcy4gVGhpcyByZXN1bHQgYXBwZWFyZWQgaW4gYSBzZXBhcmF0ZSBjb2x1bW4gYWxvbmdzaWRlIHRoZSB0b3RhbCBiYWNrIHdhZ2VzLiAKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpc2UgKHRvdGFsX0JhY2t3YWdlcyA9IHN1bSAoYndfYXRwX2FtdCksIFRvdGFsX0VtcGxveWVlX3RvX1BheSA9IHN1bSAoZWVfYXRwX2NtdCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKHRvdGFsX0JhY2t3YWdlcykpCgpgYGAKClE4LiBXaGljaCBlbXBsb3llci9idXNpbmVzcyBoYWQgdG8gcGF5IHRoZSBoaWdoZXN0IHRvdGFsIGFtb3VudCBvZiBjaXZpbCBtb25leSBwZW5hbHRpZXMgKENNUCkgZm9yIHZpb2xhdGluZyBIb3VyIGFuZCBXYWdlIENvbXBsaWFuY2UgYWNyb3NzIHRoZSBVLlMuPwojQW5zd2VyOiBUaGUgcmVzdWx0cyBjb250YWluIHNvbWUgZXJyb3JzLiBJIGFtIGdldHRpbmcgdGhlIHNhbWUgdHJhZGUgbmFtZSBhcHBlYXJpbmcgdHdpY2UgYWZ0ZXIgZ3JvdXBpbmcgdGhlIGRhdGEuIEkgY291bGRu4oCZdCBmaWd1cmUgb3V0IGV4YWN0bHkgd2h5IHRoaXMgaXMgaGFwcGVuaW5nLCBidXQgSSBmb3VuZCB0aGF0IHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSB0cmFkZSBuYW1lIGZpZWxkLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkodHJhZGVfbm0pICU+JQogIHN1bW1hcmlzZSAodG90YWxfY21wX2Fzc2QgPSBzdW0gKGNtcF9hc3NkKSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAodG90YWxfY21wX2Fzc2QpKQoKVVNfd2FnZV90aGVmdCAlPiUgZmlsdGVyKHRyYWRlX25tID09ICJQZXJpICYgU29ucyBGYXJtLCBJbmMuIikKVVNfd2FnZV90aGVmdCAlPiUgZmlsdGVyKGdyZXBsKCJQZXJpIix0cmFkZV9ubSkpICU+JSBhcnJhbmdlKGNhc2VfaWQpCgpuYW1lIDwtIFVTX3dhZ2VfdGhlZnQgJT4lIGZpbHRlcihjYXNlX2lkPT0iMTU1OTAyMSIpICU+JSBwdWxsKHRyYWRlX25tKQpVU193YWdlX3RoZWZ0ICU+JSBmaWx0ZXIodHJhZGVfbm0gPT0gbmFtZSB8IGdyZXBsKCJQZXJpICYgU29ucyIsIHRyYWRlX25tKSkKClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkobGVnYWxfbmFtZSkgJT4lCiAgc3VtbWFyaXNlICh0b3RhbF9jbXBfYXNzZCA9IHN1bSAoY21wX2Fzc2QpKSAlPiUKICBhcnJhbmdlIChkZXNjICh0b3RhbF9jbXBfYXNzZCkpCgpVU193YWdlX3RoZWZ0ICU+JSBmaWx0ZXIoZ3JlcGwoIlBlcmkgJiBTb25zIixsZWdhbF9uYW1lKSkgJT4lIGFycmFuZ2UoY2FzZV9pZCkKCmBgYAoKUTkuIFdoaWNoIGVtcGxveWVyL2J1c2luZXNzIHZpb2xhdGVkIEhvdXIgYW5kIFdhZ2UgQ29tcGxpYW5jZSBhZ2FpbnN0IHRoZSBoaWdoZXN0IG51bWJlciBvZiBlbXBsb3llZXMgaW4gdGhlIFUuUy4/CiNBbnN3ZXI6IFdhbG1hcnQuIEEgdG90YWwgb2YgODgsMjc4IGVtcGxveWVlcyB3ZXJlIGFmZmVjdGVkIGJ5IFdhbG1hcnQncyB2aW9sYXRpb25zIG9mIEhvdXIgYW5kIFdhZ2UgQ29tcGxpYW5jZSwgd2hpY2ggaXMgdGhlIGhpZ2hlc3QgbnVtYmVyIGluIFUuUy4KCiNQcm9jZXNzOiBBbm90aGVyIGltcG9ydGFudCB2YXJpYWJsZSBpbiB0aGlzIGRhdGFzZXQgaXMgZWVfdmlvbHRkX2NudCwgd2hpY2ggcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgZW1wbG95ZWVzIGFmZmVjdGVkIGJ5IHZpb2xhdGlvbnMuIFVzaW5nIHRoaXMgdmFyaWFibGUsIEkgd2FudGVkIHRvIGlkZW50aWZ5IHdoaWNoIGVtcGxveWVycyBhZmZlY3RlZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZW1wbG95ZWVzIGFjcm9zcyB0aGUgVS5TLiBUbyBhbmFseXplIHRoaXMsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSB0cmFkZV9ubSAoZW1wbG95ZXIgbmFtZSkgYW5kIHN1bW1hcml6ZWQgdGhlICJlZV92aW9sdGRfY250IiB2YXJpYWJsZS4gVGhlbiwgSSBhcnJhbmdlZCB0aGUgcmVzdWx0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIHRvIGhpZ2hsaWdodCB0aGUgZW1wbG95ZXJzIHdpdGggdGhlIGdyZWF0ZXN0IG51bWJlciBvZiBhZmZlY3RlZCBlbXBsb3llZXMuICAKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpc2UgKHRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bSAoZWVfdmlvbHRkX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKHRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcykpCgpgYGAKCjEwLiBXaGF0IGlzIHRoZSB5ZWFyLXdpc2UgdHJlbmQgZm9yIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9uIGNhc2VzIGluIHRoZSBVLlMuPwojQW5zd2VyOiBUaGUgeWVhciAyMDEwIHJlY29yZGVkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjYXNlcywgd2l0aCAyNCw5NTQuIEhvd2V2ZXIsIHRoZSBhbmFseXNpcyBzaG93cyB0aGF0IHRoZSBwZXJpb2QgZnJvbSAyMDA5IHRvIDIwMTMgc2F3IHRoZSBoaWdoZXN0IHllYXJseSBjYXNlIGNvdW50cyBmb3IgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb25zLiBUaGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgdmFyaWVkIGFjcm9zcyB0aGVzZSB5ZWFycy4gRm9yIGV4YW1wbGUsIGluIDIwMTIsIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgd2FzIGNvbXBhcmF0aXZlbHkgbG93ZXIgYW1vbmcgdGhlIHRvcCBmaXZlIHllYXJzLCBidXQgdGhlIHRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zIHdhcyB0aGUgaGlnaGVzdC4gCgojUHJvY2VzczogSSB3YW50ZWQgdG8gYW5hbHl6ZSB0aGUgeWVhci13aXNlIHRyZW5kIG9mIHRvdGFsIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9uIGNhc2VzIGFuZCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMuIFRvIGRvIHRoaXMsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSB5ZWFyIGFuZCB0aGVuIHN1bW1hcml6ZWQgYm90aCB0aGUgbnVtYmVyIG9mIGNhc2VzIGFuZCB0aGUgdG90YWwgdmlvbGF0aW9ucy5Gb3IgdGhlIG51bWJlciBvZiBjYXNlcywgSSB1c2VkIHRoZSBjb3VudCgpIGZ1bmN0aW9uIHdpdGggbigpIHRvIGNvdW50IGVhY2ggY2FzZSBhcyBhIHNpbmdsZSwgdW5pcXVlIGluc3RhbmNlLiBGb3IgdmlvbGF0aW9ucywgSSB1c2VkIHN1bSgpIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgYWNyb3NzIGFsbCBjYXNlcyBmb3IgZWFjaCB5ZWFyLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIG9mIHRvdGFsIGNhc2VzIGluIGRlc2NlbmRpbmcgb3JkZXIgdG8gb2JzZXJ2ZSB3aGljaCB5ZWFycyBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVycyBvZiBjYXNlcy4KYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZSAoIGNvdW50ID0gbigpLCBUb3RhbF9WaW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKGNvdW50KSkKCmBgYAoKUTExLiBXaGF0IGlzIHRoZSB0cmVuZCBpbiBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbiBjYXNlcyBpbiB0aGUgVS5TLiBvdmVyIHRoZSBsYXN0IDEwIHllYXJzPwojQW5zd2VyOiBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbiBjYXNlcyBhY3Jvc3MgdGhlIFUuUy4gaGF2ZSBiZWVuIHN0ZWFkaWx5IGRlY3JlYXNpbmcgb3ZlciB0aGUgcGFzdCAxMCB5ZWFycy4gSW4gMjAxNSwgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcyB3YXMgMTgsNTAwLCB3aGljaCBkcm9wcGVkIHNpZ25pZmljYW50bHkgdG8ganVzdCA3MTcgaW4gMjAyNC4gSG93ZXZlciwgdGhlIHRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zIHdpdGhpbiB0aGVzZSBjYXNlcyB2YXJpZWQgYnkgeWVhci4gRGVzcGl0ZSB0aGVzZSBmbHVjdHVhdGlvbnMsIHRoZSBudW1iZXIgb2YgdmlvbGF0aW9ucyBoYXMgYWxzbyBzaG93biBhIGRvd253YXJkIHRyZW5kIHNpbmNlIDIwMTkuCgojcHJvY2VzczogRm9yIHRoaXMgcXVlc3Rpb24sIEkgZm9sbG93ZWQgYSBzaW1pbGFyIGFwcHJvYWNoIGFzIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbnMsIGJ1dCBhZGRlZCBhIGZpbHRlciBmb3Igc3BlY2lmaWMgeWVhcnMuIFRvIGFwcGx5IHRoZSBmaWx0ZXIsIEkgdXNlZCB0aGUgJWluJSBjKCkgc3ludGF4IGZvciBhY2N1cmF0ZSByZXN1bHRzLiAKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihZZWFyICVpbiUgYygyMDE1LCAyMDE2LCAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxLCAyMDIyLCAyMDIzLCAyMDI0KSkgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXplKGNvdW50ID0gbigpLAogICAgdG90YWxfdmlvbGF0aW9uID0gc3VtKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UoZGVzYyhjb3VudCkpCgpgYGAKClExMi4gV2hpY2ggaW5kdXN0cnkgaGFzIHRoZSBoaWdoZXN0IG51bWJlciBvZiBXYWdlICYgSG91ciBDb21wbGlhbmNlIGNhc2VzIGFuZCB2aW9sYXRpb25zIGluIHRoZSBVLlMuPyBIb3cgbWFueSBlbXBsb3llZXMgd2VyZSBhZmZlY3RlZCBpbiB0aG9zZSBpbmR1c3RyaWVzPwoKI0Fuc3dlcjogSSBoYXZlIHR3byBhbnN3ZXJzIHRvIHRoaXMgcXVlc3Rpb24uIElmIEkgbG9vayBhdCB0aGUgcmF3IGRhdGEgd2l0aG91dCBjb25zaWRlcmluZyBidXNpbmVzcyBzaXplIG9yIGNvbnRleHQsIHRoZSBSZXN0YXVyYW50IGFuZCBIb3RlbCBpbmR1c3RyeSBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgY2FzZXMuIFRoaXMgaW5kdXN0cnkgYWxzbyBsZWFkcyBpbiB0b3RhbCB2aW9sYXRpb25zIGFuZCB0aGUgbnVtYmVyIG9mIGFmZmVjdGVkIGVtcGxveWVlcy4gSG93ZXZlciwgbm90IGFsbCBpbmR1c3RyaWVzIGFyZSBlcXVhbCBpbiBzaXplLCBzbyBjb21wYXJpbmcgdG90YWwgbnVtYmVycyBhbG9uZSBtYXkgbm90IGdpdmUgdGhlIGZ1bGwgcGljdHVyZS4gV2hlbiBJIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgdmlvbGF0aW9ucyBwZXIgY2FzZSwgdGhlIHJlc3VsdHMgY2hhbmdlLiBJbiB0aGF0IGNhc2UsIEhlYWx0aCBhbmQgUGVyc29uYWwgQ2FyZSBTdG9yZXMgaGF2ZSB0aGUgaGlnaGVzdCBhdmVyYWdlLCB3aXRoIGFib3V0IDMsNzEwIHZpb2xhdGlvbnMgcGVyIGNhc2UuCgojUHJvY2VzcyAoQW5zd2VyIDEg4oCTIFRvdGFsIE51bWJlcnMpOiBUbyBpZGVudGlmeSBpbmR1c3RyeS13aXNlIHBhdHRlcm5zLCBJIGdyb3VwZWQgdGhlIGRhdGFzZXQgYnkgbmFpY3NfY29kZV9kZXNjcmlwdGlvbiwgd2hpY2ggc2hvd3MgdGhlIGluZHVzdHJ5IG5hbWUuIEFmdGVyIGdyb3VwaW5nLCBJIHN1bW1hcml6ZWQgdGhyZWUga2V5IHRoaW5nczogVG90YWwgbnVtYmVyIG9mIGNhc2VzICh1c2luZyBuKCkpLCBUb3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyAodXNpbmcgc3VtKGNhc2VfdmlvbHRuX2NudCkpLCBUb3RhbCBhZmZlY3RlZCBlbXBsb3llZXMgKHVzaW5nIHN1bShlZV92b2lsdGRfY250KSkuIFRoZW4sIEkgYXJyYW5nZWQgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNhc2VzIHRvIGZpbmQgd2hpY2ggaW5kdXN0cmllcyBoYWQgdGhlIG1vc3QgcmVwb3J0ZWQgd2FnZSBhbmQgaG91ciB2aW9sYXRpb25zLgoKI1Byb2Nlc3MgKEFuc3dlciAyIOKAkyBBdmVyYWdlIFZpb2xhdGlvbnMgcGVyIENhc2UpOiBGb3IgYSBmYWlyZXIgY29tcGFyaXNvbiwgSSBhZ2FpbiBncm91cGVkIHRoZSBkYXRhIGJ5IG5haWNzX2NvZGVfZGVzY3JpcHRpb24uIEkgdXNlZCBzdW1tYXJpemUoKSB0bzogQ291bnQgdG90YWwgY2FzZXMgdXNpbmcgbigpLCBTdW0gdG90YWwgdmlvbGF0aW9ucyBhbmQgYWZmZWN0ZWQgZW1wbG95ZWVzLCBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgdmlvbGF0aW9ucyBwZXIgY2FzZSBieSBkaXZpZGluZyB0b3RhbCB2aW9sYXRpb25zIGJ5IHRoZSBjYXNlIGNvdW50LiBUbyBhdm9pZCBtaXNsZWFkaW5nIHJlc3VsdHMgZnJvbSBpbmR1c3RyaWVzIHdpdGggdmVyeSBmZXcgY2FzZXMsIEkgZmlsdGVyZWQgZm9yIGluZHVzdHJpZXMgd2l0aCBhdCBsZWFzdCA1MCBjYXNlcy4gRmluYWxseSwgSSBzb3J0ZWQgdGhlIGRhdGEgYnkgYXZlcmFnZSB2aW9sYXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIuIApgYGB7cn0KCiNQcm9jZXNzIDE6ClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkoIGluZHVzdHJ5ID0gbmFpY3NfY29kZV9kZXNjcmlwdGlvbikgJT4lCiAgc3VtbWFyaXNlICggY2FzZV9jb3VudCA9IG4oKSwgdG90YWxfdmlvbGF0aW9uID0gc3VtIChjYXNlX3Zpb2x0bl9jbnQpLCB0b3RhbF9hZmZlY3RlZF9lbXBsb3llZXMgPSBzdW0gKGVlX3Zpb2x0ZF9jbnQpKSAlPiUKICBhcnJhbmdlIChkZXNjIChjYXNlX2NvdW50KSkKCiNQcm9jZXNzIDI6ClVTX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkgKCBpbmR1c3RyeSA9IG5haWNzX2NvZGVfZGVzY3JpcHRpb24pICU+JQogIHN1bW1hcmlzZSAoY2FzZV9jb3VudCA9IG4oKSwgdG90YWxfdmlvbGF0aW9uID0gc3VtIChjYXNlX3Zpb2x0bl9jbnQpLCB0b3RhbF9hZmZlY3RlZF9lbXBsb3llZXMgPSBzdW0gKGVlX3Zpb2x0ZF9jbnQpLAogICAgICAgICAgICAgIGF2Z192aW9sYXRpb24gPSB0b3RhbF92aW9sYXRpb24gLyBjYXNlX2NvdW50KSAlPiUKICBmaWx0ZXIoY2FzZV9jb3VudCA+PSA1MCkgJT4lIAogIGFycmFuZ2UgKGRlc2MgKGF2Z192aW9sYXRpb24pKQoKYGBgCgpRMTM6IFdoaWNoIGluZGljYXRvcnMgb2YgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gZGF0YSBoYXZlIHRoZSBoaWdoZXN0IHRvdGFsIHZpb2xhdGlvbnM/IAojQW5zd2VyOiBGYW1pbHkgYW5kIE1lZGljYWwgTGVhdmUgQWN0IChGTUxBKSB2aW9sYXRpb246IDYsNjE4LDIyNi4gRm9sbG93aW5nIFNlcnZpY2UgQ29udHJhY3QgVmlvbGF0aW9uOiA0ODAsNzA0LiAKCiNQcm9jZXNzOiBXYWdlICYgSG91ciBDb21wbGluY2UgIEFjdGlvbiBkYXRhIGhhcyBtb3JlIHRoYW4gODAgdmFyaWFibGUsIGhhbGYgb2YgdGhvc2UgYXJlIHJlbGF0ZSB0byB2b2lsYXRpb24gY291bnQuIEFtb25nIHRoZW0gNiB2ZXJpYWJsZSBhcmUgbW9zdCBpbXBvdGFudCB0byBmb2xsb3cgYWNjb2RpbmcgdG8gRGVwYXJ0bWVudCBvZiBMYWJvci4gVGhhdCB3aHkgSSBtZXNzdXJlIHRob3NlIHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLiBGaXJzdCwgSSBzZWxlY3RlZCBzaXggc3BlY2lmaWMgdmlvbGF0aW9uLXJlbGF0ZWQgY29sdW1ucyBmcm9tIHRoZSBkYXRhc2V0OiBmbHNhX3Zpb2x0bl9jbnQgKEZhaXIgTGFib3IgU3RhbmRhcmRzIEFjdCB2aW9sYXRpb25zKSwgbXNwYV92aW9sdG5fY250IChNaWdyYW50IGFuZCBTZWFzb25hbCBBZ3JpY3VsdHVyYWwgV29ya2VyIFByb3RlY3Rpb24gQWN0IHZpb2xhdGlvbnMpLCBzY2FfdmlvbHRuX2NudCAoU2VydmljZSBDb250cmFjdCBBY3QgdmlvbGF0aW9ucyksIGZtbGFfdmlvbHRuX2NudCAoRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdCB2aW9sYXRpb25zKSwgaDFiX3Zpb2x0bl9jbnQgKEgtMUIgd29yayB2aXNhIHZpb2xhdGlvbnMpLCBmbHNhX2NsX3Zpb2x0bl9jbnQgKENoaWxkIExhYm9yIHZpb2xhdGlvbnMgdW5kZXIgRkxTQSkuIFRoZW4sIEkgdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyB1bmRlciBlYWNoIGxhdy4gSSByZW5hbWVkIHRoZSBvdXRwdXQgY29sdW1ucyBmb3IgY2xhcml0eSwgc28gZWFjaCB0b3RhbCByZWZsZWN0cyB0aGUgcmVzcGVjdGl2ZSB2aW9sYXRpb24gdHlwZS4gSG93ZXZlciwgdGhlIHdheSB0aGUgcmVzdWx0cyB3ZXJlIGRpc3BsYXllZCB1c2luZyB0aGUgcHJldmlvdXMgZnVuY3Rpb24gbWFkZSBpdCBkaWZmaWN1bHQgdG8gbWVhc3VyZSBvciBhbmFseXplIHRoZSBkYXRhIGNsZWFybHkuIFRoZXJlZm9yZSwgSSB3YW50ZWQgdG8gcmVzdHJ1Y3R1cmUgdGhlIG91dHB1dCBieSBoYXZpbmcgYWxsIHZpb2xhdGlvbiB0eXBlcyBsaXN0ZWQgaW4gb25lIGNvbHVtbiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2aW9sYXRpb24gbnVtYmVycyBpbiBhbm90aGVyIGNvbHVtbi4gVG8gYWNoaWV2ZSB0aGlzLCBJIHVzZWQgdGhlIHBpdm90X2xvbmdlcigpIGZ1bmN0aW9uLiBJbiBteSBtaWQtdGVybSBwcm9qZWN0LCBJIGhhZCB1c2VkIHBpdm90X3dpZGVyKCksIHNvIEkgd2FzIGFscmVhZHkgZmFtaWxpYXIgd2l0aCBob3cgdGhlIHBpdm90X2xvbmdlcigpIGZ1bmN0aW9uIHdvcmtzLiBJIGFwcGxpZWQgaXQgaGVyZSB0byBkaXNwbGF5IHRoZSByZXN1bHRzIGluIGEgbW9yZSByZWFkYWJsZSBmb3JtYXQgYW5kIHRoZW4gYXJyYW5nZWQgdGhlbSBpbiBkZXNjZW5kaW5nIG9yZGVyIGZvciBlYXNpZXIgY29tcGFyaXNvbiBhbmQgYW5hbHlzaXMuCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICAgIHNlbGVjdChmbHNhX3Zpb2x0bl9jbnQsIG1zcGFfdmlvbHRuX2NudCwgIHNjYV92aW9sdG5fY250LCAKICAgICAgICAgZm1sYV92aW9sdG5fY250LCBoMWJfdmlvbHRuX2NudCwgZmxzYV9jbF92aW9sdG5fY250KSAlPiUKICBzdW1tYXJpemUgKEZhaXJfTGFib3JfU3RhbmRhcmRzX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBNaWdyYW50X0FncmljdWx0dXJhbF9Qcm90ZWN0aW9uX1Zpb2xhdGlvbiA9IHN1bSAobXNwYV92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBTZXJ2aWNlX0NvbnRyYWN0X1Zpb2xhdGlvbiA9IHN1bSAoc2NhX3Zpb2x0bl9jbnQpLAogICAgICAgICAgICAgRmFtaWx5X01lZGljYWxfTGVhdmVfVmlvbGF0aW9uID0gc3VtIChmbWxhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIEltbWlncmF0aW9uX1dvcmtfVmlzYV9WaW9sYXRpb24gPSBzdW0gKGgxYl92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBDaGlsZF9sYWJvcl9WaW9sYXRpb24gPSBzdW0gKGZsc2FfY2xfdmlvbHRuX2NudCkpCgojRmluYWwgY29kZTogClVTX3dhZ2VfdGhlZnQgJT4lCiAgICBzZWxlY3QoZmxzYV92aW9sdG5fY250LCBtc3BhX3Zpb2x0bl9jbnQsICBzY2FfdmlvbHRuX2NudCwgCiAgICAgICAgIGZtbGFfdmlvbHRuX2NudCwgaDFiX3Zpb2x0bl9jbnQsIGZsc2FfY2xfdmlvbHRuX2NudCkgJT4lCiAgc3VtbWFyaXplIChGYWlyX0xhYm9yX1N0YW5kYXJkc19WaW9sYXRpb24gPSBzdW0gKGZsc2FfY2xfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgTWlncmFudF9BZ3JpY3VsdHVyYWxfUHJvdGVjdGlvbl9WaW9sYXRpb24gPSBzdW0gKG1zcGFfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgU2VydmljZV9Db250cmFjdF9WaW9sYXRpb24gPSBzdW0gKHNjYV92aW9sdG5fY250KSwKICAgICAgICAgICAgIEZhbWlseV9NZWRpY2FsX0xlYXZlX1Zpb2xhdGlvbiA9IHN1bSAoZm1sYV92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBJbW1pZ3JhdGlvbl9Xb3JrX1Zpc2FfVmlvbGF0aW9uID0gc3VtIChoMWJfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgQ2hpbGRfbGFib3JfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiVmlvbGF0aW9uX1R5cGUiLCB2YWx1ZXNfdG8gPSAiVG90YWxfQ291bnQiKSAlPiUKICBhcnJhbmdlKGRlc2MoVG90YWxfQ291bnQpKQoKYGBgCgpRMTQ6IEhvdyBoYXMgdGhlIG51bWJlciBvZiBtYWpvciBpbmRpY2F0b3JzIG9mIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9ucyB2YXJpZWQgb3ZlciB0aGUgeWVhcnM/CiNBbnN3ZXI6IFRoZSByZXN1bHRzIHNob3cgdGhhdCBldmVyeSBtYWpvciBpbmRpY2F0b3IgaGFzIGRlY3JlYXNlZCBzaWduaWZpY2FudGx5IG92ZXIgdGhlIHBhc3QgdGVuIHllYXJzLiBGb3IgaW5zdGFuY2UsIEZhaXIgTGFib3IgU3RhbmRhcmRzIFZpb2xhdGlvbnMgZHJvcHBlZCBmcm9tIDMsNTUwIGluIDIwMTUgdG8ganVzdCA0MiBpbiAyMDI0LiBTZXJ2aWNlIENvbnRyYWN0IFZpb2xhdGlvbiB3YXMgMjIsMjg5IGluIDIwMTUgYW5kIGRlY2xpbmVkIHRvIDIwMCBpbiAyMDI0LiBGYW1pbHkgYW5kIE1lZGljYWwgTGVhdmUgVmlvbGF0aW9ucyBkZWNyZWFzZWQgZnJvbSAyMjAsNzc0IHRvIDIsODcyLiBDaGlsZCBMYWJvciBWaW9sYXRpb24gYWxzbyBzYXcgYSByZWR1Y3Rpb24sIGZyb20gMyw1NTAgaW4gMjAxNSB0byA0MiBpbiAyMDI0LiBUaGlzIHRyZW5kIGluZGljYXRlcyBzdWJzdGFudGlhbCBpbXByb3ZlbWVudCBpbiB3YWdlIGFuZCBob3VyIGNvbXBsaWFuY2Ugb3ZlciB0aGUgbGFzdCBkZWNhZGUuICAgCgojUHJvY2VzczogVG8gYW5hbHl6ZSB5ZWFyLXdpc2UgZGF0YSBmb3IgZWFjaCBpbmRpY2F0b3IsIEkgZmlyc3QgZ3JvdXBlZCB0aGUgZGF0YXNldCBieSB5ZWFyLiBTaW5jZSB0aGUgZGF0YXNldCBzcGFucyBhIGxvbmcgcGVyaW9kLCBJIGZpbHRlcmVkIGl0IHRvIG9ubHkgaW5jbHVkZSB0aGUgbW9zdCByZWNlbnQgMTAgeWVhcnMgdXNpbmcgdGhlICVpbiUgb3BlcmF0b3IuIFRoZW4sIEkgdXNlZCB0aGUgc2FtZSBjb2RlIHN0cnVjdHVyZSBmcm9tIHRoZSBwcmV2aW91cyBxdWVzdGlvbiB0byBzdW1tYXJpemUgdmlvbGF0aW9ucyBmb3Igc2l4IG1ham9yIGluZGljYXRvcnMuIEkgYWxzbyBpbnRlbmRlZCB0byBjYWxjdWxhdGUgdGhlIG5lZ2F0aXZlIGdyb3d0aCBwZXJjZW50YWdlIG92ZXIgdGhlIHRlbi15ZWFyIHNwYW4gdG8gc2hvdyB0aGUgcmF0ZSBvZiBpbXByb3ZlbWVudCBidXQgd2FzIHVuYWJsZSB0byB3cml0ZSBhIGNvZGUgaXQgc3VjY2Vzc2Z1bGx5LiBJbnN0ZWFkLCBJIHNvcnRlZCB0aGUgc3VtbWFyaXplZCBkYXRhIGJ5IHllYXIgdG8gb2JzZXJ2ZSB0aGUgdHJlbmQuCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCkpICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHNlbGVjdChmbHNhX3Zpb2x0bl9jbnQsIG1zcGFfdmlvbHRuX2NudCwgIHNjYV92aW9sdG5fY250LCAKICAgICAgICAgZm1sYV92aW9sdG5fY250LCBoMWJfdmlvbHRuX2NudCwgZmxzYV9jbF92aW9sdG5fY250KSAlPiUKICBzdW1tYXJpemUgKEZhaXJfTGFib3JfU3RhbmRhcmRzX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBNaWdyYW50X0FncmljdWx0dXJhbF9Qcm90ZWN0aW9uX1Zpb2xhdGlvbiA9IHN1bSAobXNwYV92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBTZXJ2aWNlX0NvbnRyYWN0X1Zpb2xhdGlvbiA9IHN1bSAoc2NhX3Zpb2x0bl9jbnQpLAogICAgICAgICAgICAgRmFtaWx5X01lZGljYWxfTGVhdmVfVmlvbGF0aW9uID0gc3VtIChmbWxhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIEltbWlncmF0aW9uX1dvcmtfVmlvbGF0aW9uID0gc3VtIChoMWJfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgQ2hpbGRfbGFib3JfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpKSAlPiUKICBhcnJhbmdlIChZZWFyKQoKYGBgCgpRMTUuIEhvdyBkbyB0aGUgdG9wIGZpdmUgc3RhdGVzIHRoYXQgaGF2ZSBkb25lIHRoZSBoaWdoZXN0IHZpb2xhdGlvbnMgaW4gcGVyIDEwLDAwMCBwZW9wbGUgdmFyeSBpbiB0ZXJtcyBvZiB0b3RhbCB2aW9sYXRpb25zIG9mIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBvdmVyIHRoZSBsYXN0IDEwIHllYXJzPwojQW5zd2VyOiBBbGwgZml2ZSBzdGF0ZXMgaGF2ZSBzZWVuIGRlY3JlYXNlcyBpbiB2aW9sYXRpb25zIGJ5IDIwMjQuIEV2ZXJ5IHN0YXRlJ3MgdG90YWwgdmlvbGF0aW9uIHdhcyBiZWxvdyBhIDUwMCBsYXN0IHllYXIuIEFya2Fuc2FzIGhhZCB0aGUgaGlnaGVzdCB2aW9sYXRpb25zIGluIDIwMTYgd2l0aCA0NTYsMjM3IGFuZCByZW1haW5lZCBvbmUgb2YgdGhlIHRvcCB2aW9sYXRvcnMuIFRlbm5lc3NlZSBzYXcgdHdvIHNwaWtlcyBpbiB2aW9sYXRpb25zOiAyNjYsNDEwIGluIDIwMTkgYW5kIDI0MCw5ODIgaW4gMjAyMS4gQWxhYmFtYSBoYWQgaGlnaCB2aW9sYXRpb25zIGluIHRoZSBlYXJseSB5ZWFycywgZXNwZWNpYWxseSBpbiAyMDE2ICgxNDQsODgxKSwgdGhlbiBkZWNsaW5lZC4gUmhvZGUgSXNsYW5kIHNob3dlZCBjb25zaXN0ZW50IG1pZC10by1oaWdoIHZpb2xhdGlvbnMgd2l0aCBhIHBlYWsgaW4gMjAyMCAoMSwzNzgpLiBNaW5uZXNvdGEgaGFkIGEgaGlnaCB2aW9sYXRpb24gaW4gMjAxNyAoMzYsMDkyKSBidXQgc2F3IGEgZGVjbGluZSBhZnRlcndhcmQuCgojUHJvY2VzczogVG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIEkgZmlsdGVyZWQgdGhlIGRhdGEgYnkgYm90aCBTdGF0ZSBhbmQgWWVhciwgYXMgSSBuZWVkZWQgaW5mb3JtYXRpb24gZm9yIGZpdmUgc3BlY2lmaWMgc3RhdGVzIG92ZXIgdGhlIGxhc3QgdGVuIHllYXJzLiBGcm9tIHRoZSBiZWdpbm5pbmcgb2YgbXkgY29kZSwgSSB1c2VkIHRoZSAlaW4lIG9wZXJhdG9yIHRvIHNlbGVjdCBvbmx5IHRoZSByZWxldmFudCBzdGF0ZXMgYW5kIHllYXJzLk5leHQsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSBib3RoIFllYXIgYW5kIFN0YXRlLCBzaW5jZSBJIG5lZWRlZCB0aGUgdmlvbGF0aW9uIG51bWJlcnMgZm9yIGVhY2ggc3RhdGUgYWNyb3NzIGVhY2ggeWVhci4gQWZ0ZXIgZ3JvdXBpbmcsIEkgc3VtbWFyaXplZCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgZm9yIGVhY2ggY29tYmluYXRpb24gb2YgeWVhciBhbmQgc3RhdGUuIEZpbmFsbHksIHRvIHByZXNlbnQgdGhlIGRhdGEgY2xlYXJseSBpbiBhIHRhYnVsYXIgZm9ybWF0LCBJIHVzZWQgdGhlIHBpdm90X3dpZGVyKCkgZnVuY3Rpb24gdG8gcmVzaGFwZSB0aGUgZGF0YeKAlG1ha2luZyBlYWNoIHN0YXRlIGEgc2VwYXJhdGUgY29sdW1uIHdpdGggeWVhcnMgYXMgcm93cy4gCmBgYHtyfQoKVVNfd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoc3RfY2QgJWluJSBjKCJBUiIsICJSSSIsICJUTiIsICJNTiIsICJBTCIpKSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCkpICU+JQogIGdyb3VwX2J5KFllYXIsIHN0X2NkKSAlPiUKICBzdW1tYXJpemUodG90YWxfdmlvbGF0aW9uID0gc3VtKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAic3RfY2QiLCAKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9ICJ0b3RhbF92aW9sYXRpb24iKSAKCmBgYAoKUTE2LiBIb3cgaGF2ZSB0aGUgc3RhdGVzIHZhcmllZCBpbiB0ZXJtcyBvZiB0b3RhbCB2aW9sYXRpb25zIG9mIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBvdmVyIHRoZSBsYXN0IDEwIHllYXJzPwojQW5zd2VyOiBUaGUgZGF0YSBkb2VzIG5vdCBwcm92aWRlIGEgc2luZ2xlLCBzcGVjaWZpYyBhbnN3ZXIgYnV0IHJhdGhlciBhIHRhYmxlIHdpdGggMTAgY29sdW1ucyBhbmQgNTcgcm93cyByZXByZXNlbnRpbmcgZGlmZmVyZW50IHN0YXRlcyBhbmQgdGVycml0b3JpZXMuIEhvd2V2ZXIsIHN0YXRlcyB3aXRoIHRoZSBoaWdoZXN0IHRvdGFsIG51bWJlciBvZiB2aW9sYXRpb25zIGFsc28gdGVuZCB0byByYW5rIGhpZ2ggYWNyb3NzIGVhY2ggeWVhci4gSG93ZXZlciwgdGhlIHRyZW5kIG9mIG51bWJlcnMgZm9yIGVhY2ggc3RhdGUgaGFzIGJlZW4gZGVjbGluaW5nLiAKCiNQcm9jZXNzOiBUbyBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgSSBmaWx0ZXJlZCB0aGUgZGF0YSBieSBZZWFyLCBhcyBJIG5lZWRlZCBpbmZvcm1hdGlvbiBmb3IgdGVuIHNwZWNpZmljIHllYXJzLiBJIHVzZWQgdGhlICVpbiUgb3BlcmF0b3IgdG8gc2VsZWN0IG9ubHkgdGhlIHJlbGV2YW50IHllYXJzLiBOZXh0LCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgYm90aCBZZWFyIGFuZCBTdGF0ZSwgc2luY2UgSSBuZWVkZWQgdGhlIHZpb2xhdGlvbiBudW1iZXJzIGZvciBlYWNoIHN0YXRlIGFjcm9zcyBmaWx0ZXJlZCB5ZWFyLiBBZnRlciBncm91cGluZywgSSBzdW1tYXJpemVkIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyBmb3IgZWFjaCBjb21iaW5hdGlvbiBvZiB5ZWFyIGFuZCBzdGF0ZS4gRmluYWxseSwgdG8gcHJlc2VudCB0aGUgZGF0YSBjbGVhcmx5IGluIGEgdGFidWxhciBmb3JtYXQsIEkgdXNlZCB0aGUgcGl2b3Rfd2lkZXIoKSBmdW5jdGlvbiB0byByZXNoYXBlIHRoZSBkYXRh4oCUbWFraW5nIGVhY2ggc3RhdGUgYSBzZXBhcmF0ZSBjb2x1bW4gd2l0aCB5ZWFycyBhcyByb3dzLiAKYGBge3J9CgpVU193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihZZWFyICVpbiUgYygyMDE1LCAyMDE2LCAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxLCAyMDIyLCAyMDIzLCAyMDI0KSkgJT4lCiAgZ3JvdXBfYnkoWWVhciwgc3RfY2QpICU+JQogIHN1bW1hcml6ZSh0b3RhbF92aW9sYXRpb24gPSBzdW0oY2FzZV92aW9sdG5fY250KSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9ICJzdF9jZCIsIAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gInRvdGFsX3Zpb2xhdGlvbiIpIAoKYGBgClExNy4gV2hpY2ggc3RhdGUgdGFrZXMgdGhlIGxvbmdlc3QgdGltZSB0byBjb21wbGV0ZSBhIGZpbmRpbmcgb24gYXZlcmFnZT8KI0Fuc3dlcjogUmhvZGUgSXNsYW5kIHRha2VzIHRoZSBsb25nZXN0IHRpbWUgdG8gY29tcGxldGUgYSBmaW5kaW5nLCB3aXRoIGFuIGF2ZXJhZ2Ugb2YgNjc1IGRheXMsIHdoaWNoIGlzIGFsbW9zdCB0d28geWVhcnMuIFRoZSBtZWRpYW4gdGltZSB0byBjb21wbGV0ZSBhIGNhc2UgdGhlcmUgaXMgZXZlbiBoaWdoZXLigJQ3MjggZGF5cy4KCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZmlyc3QgY3JlYXRlZCBhIG5ldyB2YXJpYWJsZSBpbiB0aGUgZGF0YXNldCBjYWxsZWQgRGF5c190b19jb21wbGV0ZSwgd2hpY2ggSSBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIGZpbmRpbmdzX3N0YXJ0X2RhdGUgZnJvbSBmaW5kaW5nc19lbmRfZGF0ZSB1c2luZyB0aGUgYXMubnVtZXJpYygpIGZ1bmN0aW9uLiBOZXh0LCBJIGFycmFuZ2VkIHRoZSBkYXRhIGJ5IERheXNfdG9fY29tcGxldGUgaW4gZGVzY2VuZGluZyBvcmRlci4gSG93ZXZlciwgSSBmb3VuZCBzb21lIGluY29ycmVjdCB2YWx1ZXMgaW4gdGhlIGRhdGVz4oCUc29tZSByZWNvcmRzIHNob3dlZCBkYXRlcyBsaWtlIHRoZSB5ZWFyIDE5MDAgb3IgMzUxOSwgd2hpY2ggYXJlIGxpa2VseSB0eXBvcy4gQWNjb3JkaW5nIHRvIHRoZSBkYXRhIGRpY3Rpb25hcnksIHRoZSBXYWdlICYgSG91ciBDb21wbGlhbmNlIEFjdGlvbiBEYXRhIGluY2x1ZGVzIHJlY29yZHMgb25seSBmcm9tIDE5ODUgdG8gdGhlIHByZXNlbnQsIHNvIEkgZmlsdGVyZWQgdGhlIGRhdGEgdG8gaW5jbHVkZSBvbmx5IGRhdGVzIGJldHdlZW4gMTk4NSBhbmQgMjAyNS4gQWZ0ZXIgZmlsdGVyaW5nLCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgc3RhdGUgdG8gc2VlIHdoaWNoIHN0YXRlcyB0b29rIHRoZSBsb25nZXN0IHRpbWUgdG8gY29tcGxldGUgYSBjYXNlLiBJIHRoZW4gdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGJvdGggdGhlIGF2ZXJhZ2UgKG1lYW4pIGFuZCBtZWRpYW4gbnVtYmVyIG9mIGRheXMgdG8gY29tcGxldGUgYSBmaW5kaW5nLiBUbyBrZWVwIHRoZSByZXN1bHRzIHJlYWxpc3RpYyBhbmQgYXZvaWQgbWlzc2xlYWRpbmcgcmVzdWx0cyBmcm9tIHN0YXRlcyB3aXRoIHZlcnkgZmV3IGNhc2VzLCBJIGZpbHRlcmVkIGZvciBzdGF0ZXMgd2l0aCBtb3JlIHRoYW4gNTAgY2FzZXMuCmBgYHtyfQoKVVNfd2FnZV90aGVmdCA8LSBVU193YWdlX3RoZWZ0ICU+JQogIG11dGF0ZSAoZmluZGluZ3Nfc3RhcnRfZGF0ZSA9IHltZCAoZmluZGluZ3Nfc3RhcnRfZGF0ZSksIAogICAgICAgICAgZmluZGluZ3NfZW5kX2RhdGUgPSB5bWQgKGZpbmRpbmdzX2VuZF9kYXRlKSwKICAgICAgICAgIERheXNfdG9fY29tcGxldGUgPSBhcy5udW1lcmljIChmaW5kaW5nc19lbmRfZGF0ZSAtIGZpbmRpbmdzX3N0YXJ0X2RhdGUpKSAlPiUKICBhcnJhbmdlIChkZXNjKERheXNfdG9fY29tcGxldGUpKQoKI0ZpbmFsIGNvZGU6ClVTX3dhZ2VfdGhlZnQgJT4lCiAgICBtdXRhdGUoZmluZGluZ3Nfc3RhcnRfZGF0ZSA9IHltZChmaW5kaW5nc19zdGFydF9kYXRlKSwgCiAgICBmaW5kaW5nc19lbmRfZGF0ZSA9IHltZChmaW5kaW5nc19lbmRfZGF0ZSksCiAgICBEYXlzX3RvX2NvbXBsZXRlID0gYXMubnVtZXJpYyhmaW5kaW5nc19lbmRfZGF0ZSAtIGZpbmRpbmdzX3N0YXJ0X2RhdGUpKSAlPiUKICBmaWx0ZXIoWWVhciA+PSAxOTg1ICYgWWVhciA8PSAyMDI1KSAlPiUKICBncm91cF9ieShzdF9jZCkgJT4lCiAgc3VtbWFyaXplKGF2Z19kYXlzX3RvX2NvbXBsZXRlID0gbWVhbihEYXlzX3RvX2NvbXBsZXRlLCBuYS5ybSA9IFRSVUUpLAogICAgbWVkaWFuX2RheXMgPSBtZWRpYW4oRGF5c190b19jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgIHRvdGFsX2Nhc2UgPSBuKCkpICU+JQogIGZpbHRlcih0b3RhbF9jYXNlID49IDUwKSAlPiUKICBhcnJhbmdlKGRlc2MoYXZnX2RheXNfdG9fY29tcGxldGUpKQoKYGBgCiNNaXNzb3VyaSBzcGVjaWZpYyBkYXRhc2V0OiAKCiNQcm9jZXNzOiBBZnRlciBhbmFseXppbmcgbmF0aW9uYWwgcGVyY3NwZWN0aXZlIGZyb20gdGhlIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gRGF0YSwgSSB3YW50ZWQgdG8gbG9vayBpbnRvIG1pc3NvdXJpIHNwZWNpZmljIGRhdGEgc2V0LiBUaGVyZWZvcmUgSSBmaWx0ZXIgTWlzc291cmkgZGF0YSBvbmx5IGZvciBteSBmdXJ0aGVyIGFuYWx5c2lzLiBGb3IgdGhhdCwgSSB1c2UgZmlsdGVyIGZ1bnRpb24gYW5kIGNyZWF0ZSBhIG5ldyBkYXRhIHNldCBjYWxsZWQgIk1PX3dhZ2VfdGhlZnQiIGZvciBmdXJ0aHVyIGFuYWx5c2lzLiAKYGBge3J9CgpNT193YWdlX3RoZWZ0IDwtIFVTX3dhZ2VfdGhlZnQgJT4lCiAgZmlsdGVyKHN0X2NkID09ICJNTyIpCgpgYGAKCgojTWlzc291cmkgY2xlYW4gZGF0YXNldAojRXhjbHVkZSB0aGUgY29sdW1ucyB0aGF0IGNvbnRhaW4gb25seSB6ZXJvcyBpbiBhbGwgcm93cy4KCiNQcm9jZXNzOiBJIGZsbG93ZWQgdGhpcyBwcm9jZXNzIGluIG5hdGlvbmFsIGRhdGEgc2V0IGFzIHdlbGwgdG8gZXhjbHVkZSB0aGUgcm93cyB0aG9zZSBoYXZlIGFueSBkYXRhLiBJIHVzZWQgdGhlIHNlbGVjdCgpIGZ1bmN0aW9uIHRvIGNob29zZSB3aGljaCBjb2x1bW5zIHRvIGtlZXAsIGNvbWJpbmVkIHdpdGggd2hlcmUofiFhbGwoLiA9PSAwKSkgdG8gZmlsdGVyIG91dCBjb2x1bW5zIHdoZXJlIGFsbCB2YWx1ZXMgYXJlIHplcm8uIFRoZSBjb2RlIH4hYWxsKC4gPT0gMCksIG1lYW5zICJrZWVwIGNvbHVtbnMgd2hlcmUgbm90IGFsbCB2YWx1ZXMgYXJlIHplcm8iLiBJdCByZW1vdmVzIG9ubHkgY29sdW1ucyB3aGVyZSBldmVyeSBzaW5nbGUgdmFsdWUgaXMgemVyby4gVGhlIHJlc3VsdCB3YXMgc3RvcmVkIGJhY2sgaW4gdGhlIG9yaWdpbmFsIGRhdGFzZXQgY2FsbGVkIE1PX3dhZ2VfdGhlZnQgd2l0aCA3NSBjb2x1bW5zLCB3aGljaCB3YXMgOTggZm9yIG5hdGlvbmFsIGRhdGEgc2V0LiAgCmBgYHtyfQoKTU9fd2FnZV90aGVmdCA8LSBNT193YWdlX3RoZWZ0ICU+JQogIHNlbGVjdCh3aGVyZSh+IWFsbCguID09IDApKSkKCmBgYAoKCiNTdGFuZGFyZGl6ZSB0aGUgQ2l0eSBOYW1lcyB0byBBbGwgVXBwZXJjYXNlIExldHRlcnMKI1Byb2Nlc3M6IEkgZm91bmQgdGhhdCBzb21lIGNpdHkgbmFtZXMgYXBwZWFyZWQgaW4gZGlmZmVyZW50IGZvcm1hdHPigJRmb3IgaW5zdGFuY2UsIGJvdGggIlNhaW50IExvdWlzIiBhbmQgIlNBSU5UIExPVUlTIiB3ZXJlIHByZXNlbnQuIFRvIGVuc3VyZSBjb25zaXN0ZW5jeSBpbiBteSBhbmFseXNpcywgSSBzdGFuZGFyZGl6ZWQgYWxsIGNpdHkgbmFtZXMgdG8gdXBwZXJjYXNlLiBUbyBkbyB0aGlzLCBJIHVzZWQgdGhlIG11dGF0ZSgpIGZ1bmN0aW9uIGFsb25nIHdpdGggdGhlIHRvdXBwZXIoKSBmdW5jdGlvbi4gVGhlIHRvdXBwZXIoKSBmdW5jdGlvbiBjb252ZXJ0cyBhbGwgdGV4dCBpbiB0aGUgY3R5X25tIGNvbHVtbiB0byB1cHBlcmNhc2UgbGV0dGVycy4gSSB1cGRhdGVkIHRoZSBvcmlnaW5hbCBkYXRhc2V0IGJ5IGFzc2lnbmluZyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIHNhbWUgbmFtZTogTU9fd2FnZV90aGVmdC4KYGBge3J9CgpNT193YWdlX3RoZWZ0IDwtIE1PX3dhZ2VfdGhlZnQgJT4lCiAgbXV0YXRlKGN0eV9ubSA9IHRvdXBwZXIoY3R5X25tKSkKCmBgYAoKClExODogV2hpY2ggY29tcGFueS9lbXBsb3llciBpbiBNaXNzb3VyaSBoYWQgdGhlIGhpZ2hlc3QgcmVjb3JkIG9mIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgY2FzZXMgYW5kIG51bWJlciBvZiB2aW9sYXRpb25zPwojQW5zd2VyOiBJIGhhdmUgdHdvIGFuc3dlcnMgdG8gdGhpcyBxdWVzdGlvbi4gSWYgSSBsb29rIGF0IHRoZSByYXcgZGF0YSB3aXRob3V0IGNvbnNpZGVyaW5nIGJ1c2luZXNzIHNpemUgb3IgY29udGV4dCwgSGlnaGVzdCBudW1iZXIgb2YgY2FzZXM6IFN1YndheSwgd2l0aCAzMyBjYXNlcy4gSGlnaGVzdCBudW1iZXIgb2YgdmlvbGF0aW9uczogR2VvcmdlJ3MgUHJvY2Vzc2luZywgSW5jb3Jwb3JhdGVkLCB3aXRoIGEgdG90YWwgb2YgMywxNDggdmlvbGF0aW9ucyBhY3Jvc3MgMiBjYXNlcy4gSG93ZXZlciwgbm90IGFsbCBidXNpbmVzcyBhcmUgZXF1YWwgaW4gc2l6ZSwgc28gY29tcGFyaW5nIHRvdGFsIG51bWJlcnMgYWxvbmUgbWF5IG5vdCBnaXZlIHRoZSBmdWxsIHBpY3R1cmUuIFdoZW4gSSBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHZpb2xhdGlvbnMgcGVyIGNhc2UsIHRoZSByZXN1bHRzIGNoYW5nZS4gSW4gdGhhdCBjYXNlLCBJbW8ncyBQaXp6YSBoYXZlIHRoZSBoaWdoZXN0IGF2ZXJhZ2UsIHdpdGggYWJvdXQgMjMgdmlvbGF0aW9ucyBwZXIgY2FzZS4KCiNQcm9jZXNzIDEgKFRvdGFsIE51bWJlcnMpOiBUbyBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcyBhbmQgdmlvbGF0aW9uLCBJIHVzZWQgYSBzaW1pbGFyIGFwcHJvYWNoIGluIGJvdGggY2FzZXMsIHdpdGggb25seSBhIHNtYWxsIGRpZmZlcmVuY2UgaW4gdGhlIGFycmFuZ2VtZW50IHN0ZXAuIEkgd2FudGVkIHRvIHByZXNlbnQgdGhlIG51bWJlciBvZiBjYXNlcyBhbmQgdG90YWwgdmlvbGF0aW9ucyBhdCB0aGUgc2FtZSB0aW1lLCBidXQgc2luY2UgdGhlIGVtcGxveWVycyB3aXRoIHRoZSBoaWdoZXN0IGNhc2UgY291bnQgYW5kIGhpZ2hlc3QgdG90YWwgdmlvbGF0aW9ucyB3ZXJlIGRpZmZlcmVudCwgSSB3cm90ZSB0d28gc2VwYXJhdGUgY29kZSBibG9ja3MuIFRoZSBjb2Rld2FzICBzaW1wbGUgYW5kIHNpbWlsYXIgdG8gd2hhdCBJIHVzZWQgZm9yIHRoZSBuYXRpb25hbC1sZXZlbCBkYXRhLiBGaXJzdCwgSSBncm91cGVkIHRoZSBkYXRhIGJ5IHRyYWRlX25tIChlbXBsb3llciBuYW1lKSwgdGhlbiBzdW1tYXJpemVkIGl0LiBGb3IgdGhlIG51bWJlciBvZiBjYXNlcywgSSB1c2VkIHRoZSBuKCkgZnVuY3Rpb24gdG8gY291bnQgaG93IG1hbnkgdGltZXMgZWFjaCBlbXBsb3llciBhcHBlYXJlZCBpbiB0aGUgdHJhZGVfbm0gY29sdW1u4oCUZWFjaCBhcHBlYXJhbmNlIHJlcHJlc2VudHMgYSBjYXNlLkZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMsIEkgdXNlZCB0aGUgc3VtKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCB2aW9sYXRpb24gY291bnQgcGVyIGVtcGxveWVyLgoKI1Byb2Nlc3MgMiAoQXZlcmFnZSBWaW9sYXRpb25zIHBlciBDYXNlKTogRm9yIGEgZmFpcmVyIGNvbXBhcmlzb24sIEkgYWdhaW4gZ3JvdXBlZCB0aGUgZGF0YSBieSBidXNpbmVzcyAodHJhZGVfbm0pLiBJIHVzZWQgc3VtbWFyaXplKCkgdG86IENvdW50IHRvdGFsIGNhc2VzIHVzaW5nIG4oKSwgU3VtIHRvdGFsIHZpb2xhdGlvbnMgYW5kIGFmZmVjdGVkIGVtcGxveWVlcywgQ2FsY3VsYXRlIHRoZSBhdmVyYWdlIHZpb2xhdGlvbnMgcGVyIGNhc2UgYnkgZGl2aWRpbmcgdG90YWwgdmlvbGF0aW9ucyBieSB0aGUgY2FzZSBjb3VudC4gVG8gYXZvaWQgbWlzbGVhZGluZyByZXN1bHRzIGZyb20gYnVzaW5lc3Mgd2l0aCB2ZXJ5IGZldyBjYXNlcywgSSBmaWx0ZXJlZCBmb3IgYnVzaW5lc3Mgd2l0aCBhdCBsZWFzdCAxMCBjYXNlcy4gRmluYWxseSwgSSBzb3J0ZWQgdGhlIGRhdGEgYnkgYXZlcmFnZSB2aW9sYXRpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIuIApgYGB7cn0KCiNQcm9jZXNzIDE6Ck1PX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkodHJhZGVfbm0pICU+JQogIHN1bW1hcmlzZSAoIGNvdW50ID0gbigpLCAKICAgICAgICAgICAgICBUb3RhbF9WaW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKGNvdW50KSkKCiNQcm9jZXNzIDI6IApNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpc2UgKGNhc2VfY291bnQgPSBuKCksIAogICAgICAgICAgICAgVG90YWxfVmlvbGF0aW9uID0gc3VtIChjYXNlX3Zpb2x0bl9jbnQpLAogICAgICAgICAgICAgVG90YWxfYWZmZWN0ZWRfZW1wbG95ZWVzID0gc3VtIChlZV92aW9sdGRfY250KSwKICAgICAgICAgICAgIEF2Z192aW9sYXRpb24gPSBUb3RhbF9WaW9sYXRpb24gLyBjYXNlX2NvdW50KSAlPiUKICBmaWx0ZXIoY2FzZV9jb3VudCA+PSAxMCkgJT4lIAogIGFycmFuZ2UgKGRlc2MgKEF2Z192aW9sYXRpb24pKQoKYGBgCgpRMTk6IFdoaWNoIGNvbXBhbnkvZW1wbG95ZXIgaW4gTWlzc291cmkgaGFkIHRvIHBheSB0aGUgaGlnaGVzdCBiYWNrIHdhZ2VzLCBhbmQgaG93IG1hbnkgZW1wbG95ZWVzIHJlY2VpdmVkIHRob3NlIGJhY2sgd2FnZXMgZnJvbSBlYWNoIGVtcGxveWVyPwojQW5zd2VyOiBHZW9yZ2UncyBQcm9jZXNzaW5nLCBJbmNvcnBvcmF0ZWQgcGFpZCBhIHRvdGFsIG9mICQxLDI0NSwyNTcuMDkgdG8gMywwODQgZW1wbG95ZWVzLiAKCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSBlbXBsb3llciBuYW1lICh0cmFkZV9ubSkuIFRoZW4sIEkgc3VtbWFyaXplZCB0aGUgZGF0YSB1c2luZyBib3RoIGJ3X2F0cF9hbXQgKHdoaWNoIHJlcHJlc2VudHMgYmFjayB3YWdlcyBwYWlkKSBhbmQgZWVfYXRwX2NtdCAod2hpY2ggcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGVtcGxveWVlcyB3aG8gcmVjZWl2ZWQgdGhvc2Ugd2FnZXMpLiBJIGFycmFuZ2VkIHRoZSBzdW1tYXJpemVkIGRhdGEgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0b3RhbCBiYWNrIHdhZ2VzLiBTaW5jZSB0aGUgZW1wbG95ZXIgd2hvIHBhaWQgdGhlIGhpZ2hlc3QgYW1vdW50IGFsc28gaGFwcGVuZWQgdG8gcGF5IHRoZSBoaWdoZXN0IG51bWJlciBvZiBlbXBsb3llZXMsIEkgZGlkbuKAmXQgbmVlZCB0byB3cml0ZSBhIHNlcGFyYXRlIGNvZGUgZm9yIGVtcGxveWVlIGNvdW504oCUYm90aCByZXN1bHRzIGNvdWxkIGJlIHNob3duIGluIG9uZSB0YWJsZS4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpc2UgKHRvdGFsX0JhY2t3YWdlcyA9IHN1bSAoYndfYXRwX2FtdCksIAogICAgICAgICAgICAgVG90YWxfRW1wbG95ZWVfdG9fUGF5ID0gc3VtIChlZV9hdHBfY210KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAodG90YWxfQmFja3dhZ2VzKSkKCmBgYAoKUTIwOiBXaGljaCBlbXBsb3llci9idXNpbmVzcyBoYWQgdG8gcGF5IHRoZSBoaWdoZXN0IHRvdGFsIGFtb3VudCBvZiBDaXZpbCBNb25leSBQZW5hbHRpZXMgKENNUCkgaW4gTWlzc291cmkgZm9yIHZpb2xhdGluZyBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2U/CiNBbnN3ZXI6IE1pc3NvdXJpIFZlZ2V0YWJsZSBGYXJtIHBhaWQgdGhlIGhpZ2hlc3QgdG90YWwgYW1vdW50IGluIGNpdmlsIG1vbmV5IHBlbmFsdGllcywgd2l0aCAkMzg0LDYyNi42MS4KCiNQcm9jZXNzOiBUbyBmaW5kIHRoaXMsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSBlbXBsb3llciBuYW1lICh0cmFkZV9ubSkuIEFmdGVyIHRoYXQsIEkgc3VtbWFyaXplZCB0aGUgY21wX2Fzc2QgY29sdW1uLCB3aGljaCByZXByZXNlbnRzIHRoZSB0b3RhbCBhbW91bnQgb2YgY2l2aWwgbW9uZXkgcGVuYWx0aWVzIGltcG9zZWQgb24gZW1wbG95ZXJzLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYmFzZWQgb24gdGhlIHRvdGFsIENNUCBhbW91bnQgKGNtcF9hc3NkKSB0byBpZGVudGlmeSB0aGUgdG9wIHZpb2xhdG9yLiAgCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieSh0cmFkZV9ubSkgJT4lCiAgc3VtbWFyaXNlICh0b3RhbF9jbXBfYXNzZCA9IHN1bSAoY21wX2Fzc2QpKSAlPiUKICBhcnJhbmdlIChkZXNjICh0b3RhbF9jbXBfYXNzZCkpCgpgYGAKCgpRMjE6IFdoaWNoIGNpdHkgaW4gTWlzc291cmkgZXhwZXJpZW5jZWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNhc2VzLCBoaWdoZXN0IG51bWJlciBvZiB2aW9sYXRpb25zLCBhbmQgdGhlIG1vc3QgYWZmZWN0ZWQgZW1wbG95ZWVzIGFjY29yZGluZyB0byB0aGUgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb24gZGF0YT8KI0Fuc3dlcjogU2FpbnQgTG91aXMgcmVjb3JkZWQgdGhlIGhpZ2hlc3QgbnVtYmVycyB3aXRoIDEsNDg3IGNhc2VzLCAyNSwwMTkgdG90YWwgdmlvbGF0aW9ucywgYW5kIDIxLDk1NiBhZmZlY3RlZCBlbXBsb3llZXMuCgojUHJvY2VzczogRmlyc3QsIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSBjaXR5IG5hbWUgKGN0eV9ubSkuIFRvIGFuc3dlciBhbGwgdGhyZWUgcGFydHMgb2YgdGhlIHF1ZXN0aW9uIHRvZ2V0aGVyLCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uOiBGb3IgdGhlIG51bWJlciBvZiBjYXNlcywgSSB1c2VkIHRoZSBuKCkgZnVuY3Rpb24uIFNpbmNlIGVhY2ggcm93IHJlcHJlc2VudHMgYSBjYXNlLCBjb3VudGluZyBob3cgbWFueSB0aW1lcyBhIGNpdHkgYXBwZWFycyBnaXZlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGNhc2VzLiBGb3IgdG90YWwgdmlvbGF0aW9ucyBhbmQgYWZmZWN0ZWQgZW1wbG95ZWVzLCBJIHVzZWQgdGhlIHN1bSgpIGZ1bmN0aW9uIG9uIHRoZSByZWxldmFudCBjb2x1bW5zLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSByZXN1bHRzIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIG51bWJlciBvZiBjYXNlcy4gCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShjdHlfbm0pICU+JQogIHN1bW1hcmlzZSAoIGNvdW50ID0gbigpLCAKICAgICAgICAgICAgICBUb3RhbF9WaW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgIFRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bSAoZWVfdmlvbHRkX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKGNvdW50KSkKCmBgYAoKUTIyOiBJbiB3aGljaCB5ZWFyIGRpZCBNaXNzb3VyaSBleHBlcmllbmNlIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjYXNlcywgaGlnaGVzdCBudW1iZXIgb2YgdmlvbGF0aW9ucywgYW5kIHRoZSBtb3N0IGFmZmVjdGVkIGVtcGxveWVlcyBhY2NvcmRpbmcgdG8gdGhlIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9uIGRhdGE/CiNBbnN3ZXI6IFRoZSBoaWdoZXN0IG51bWJlciBvZiBjYXNlcyB3YXMgZmlsZWQgaW4gMjAwOSwgd2l0aCA1MjcgY2FzZXMuIFRoZSBoaWdoZXN0IG51bWJlciBvZiB2aW9sYXRpb25zIG9jY3VycmVkIGluIDIwMDYsIHdpdGggMTIsMzI5IHZpb2xhdGlvbnMuIFRoYXQgc2FtZSB5ZWFyICgyMDA2KSwgMTEsOTA3IGVtcGxveWVlcyB3ZXJlIGFmZmVjdGVk4oCUdGhlIGhpZ2hlc3QgcmVjb3JkZWQuIAoKI1Byb2Nlc3M6VGhlIHByb2Nlc3Mgd2FzIHNpbWlsYXIgdG8gdGhlIG9uZSBJIHVzZWQgaW4gcHJldmlvdXMgcXVlc3Rpb25zLiBJIHN0YXJ0ZWQgYnkgZ3JvdXBpbmcgdGhlIGRhdGEgYnkgeWVhciwgdGhlbiB1c2VkIGNvdW50KCkgYW5kIHN1bW1hcml6ZSgpIHRvIGdldCB2YWx1ZXMgZm9yIHRoZSB0aHJlZSB2YXJpYWJsZXM6IG51bWJlciBvZiBjYXNlcywgdG90YWwgdmlvbGF0aW9ucywgYW5kIG51bWJlciBvZiBhZmZlY3RlZCBlbXBsb3llZXMuU2luY2UgdGhlIHllYXIgd2l0aCB0aGUgbW9zdCBjYXNlcyB3YXMgZGlmZmVyZW50IGZyb20gdGhlIHllYXIgd2l0aCB0aGUgbW9zdCB2aW9sYXRpb25zIGFuZCBhZmZlY3RlZCBlbXBsb3llZXMsIEkgdXNlZCB0aGUgc2FtZSBjb2RlIGJ1dCBhcnJhbmdlZCB0aGUgcmVzdWx0cyBzZXBhcmF0ZWx54oCUZmlyc3QgYnkgY2FzZSBjb3VudCwgdGhlbiBieSB0b3RhbCB2aW9sYXRpb25z4oCUdG8gaWRlbnRpZnkgZWFjaCBoaWdoZXN0IHllYXIuCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UgKCBjb3VudCA9IG4oKSwgCiAgICAgICAgICAgICAgVG90YWxfVmlvbGF0aW9uID0gc3VtIChjYXNlX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgICBUb3RhbF9hZmZlY3RlZF9lbXBsb3llZXMgPSBzdW0gKGVlX3Zpb2x0ZF9jbnQpKSAlPiUKICBhcnJhbmdlIChkZXNjIChjb3VudCkpCgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZSAoIGNvdW50ID0gbigpLCAKICAgICAgICAgICAgICBUb3RhbF9WaW9sYXRpb24gPSBzdW0gKGNhc2VfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgIFRvdGFsX2FmZmVjdGVkX2VtcGxveWVlcyA9IHN1bSAoZWVfdmlvbHRkX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MgKFRvdGFsX1Zpb2xhdGlvbikpCgpgYGAKClEyMzogSG93IGhhcyBNaXNzb3VyaSBiZWVuIGV4cGVyaWVuY2luZyBXYWdlICYgSG91ciBDb21wbGlhbmNlIGNhc2VzLCB2aW9sYXRpb25zLCBhbmQgYWZmZWN0ZWQgZW1wbG95ZWVzIG92ZXIgdGhlIGxhc3QgMTAgeWVhcnM/CiNBbnN3ZXI6IE1pc3NvdXJpIGhhcyBiZWVuIGV4cGVyaWVuY2luZyBhIGRlY2xpbmluZyB0cmVuZCBpbiBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9ucyBzaW5jZSAyMDIwLiBJbiB0aGF0IHllYXIsIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgd2FzIDMxOCwgd2hpY2ggZHJvcHBlZCBzaWduaWZpY2FudGx5IHRvICA2IGNhc2VzIGJ5IDIwMjQuIEZpdmUgeWVhcnMgYWdvLCB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgd2FzIDMsNjYxLCBhbmQgdGhlIG51bWJlciBvZiBhZmZlY3RlZCBlbXBsb3llZXMgd2FzIDMsMDY2LiBJbiAyMDI0LCB0aGVzZSBudW1iZXJzIGRlY2xpbmVkIHRvIDg4IHZpb2xhdGlvbnMgYW5kIDYwIGFmZmVjdGVkIGVtcGxveWVlcywgcmVzcGVjdGl2ZWx5IAoKI1Byb2Nlc3M6IFRvIGFuYWx5emUgdGhlIGxhc3QgMTAgeWVhcnMsIEkgZmlsdGVyZWQgdGhlIGRhdGFzZXQgdXNpbmcgdGhlICVpbiUgb3BlcmF0b3IgYW5kIGxpc3RlZCBlYWNoIG9mIHRoZSBsYXN0IHRlbiB5ZWFycyBleHBsaWNpdGx5LiBBZnRlciBmaWx0ZXJpbmcsIEkgZm9sbG93ZWQgdGhlIHNhbWUgYXBwcm9hY2ggYXMgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uOiBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgeWVhciBhbmQgdGhlbiB1c2VkIGNvdW50KCkgYW5kIHN1bW1hcml6ZSgpIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNhc2VzLCB0b3RhbCB2aW9sYXRpb25zLCBhbmQgYWZmZWN0ZWQgZW1wbG95ZWVzLiBGaW5hbGx5LCBJIGFycmFuZ2VkIHRoZSBkYXRhIGluIGFzY2VuZGluZyBvcmRlciB0byBnZXQgeWVhci13aXNlIHRyZW5kcyBjbGVhcmx5LgpgYGB7cn0KCk1PX3dhZ2VfdGhlZnQgJT4lCiAgZmlsdGVyKFllYXIgJWluJSBjKDIwMTUsIDIwMTYsIDIwMTcsIDIwMTgsIDIwMTksIDIwMjAsIDIwMjEsIDIwMjIsIDIwMjMsIDIwMjQpKSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpemUoY291bnQgPSBuKCksCiAgICB0b3RhbF92aW9sYXRpb24gPSBzdW0oY2FzZV92aW9sdG5fY250KSwgCiAgICBUb3RhbF9hZmZlY3RlZF9lbXBsb3llZXMgPSBzdW0gKGVlX3Zpb2x0ZF9jbnQpKSAlPiUKICBhcnJhbmdlIChZZWFyKQoKYGBgCgpRMjQuIFdoaWNoIGluZHVzdHJ5IGluIE1pc3NvdXJpIGV4cGVyaWVuY2VkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjYXNlcywgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHZpb2xhdGlvbnMsIGFuZCB0aGUgbW9zdCBhZmZlY3RlZCBlbXBsb3llZXMgYWNjb3JkaW5nIHRvIHRoZSBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbiBkYXRhPwojQW5zd2VyOiBGdWxsLVNlcnZpY2UgUmVzdGF1cmFudHMgcmVjb3JkZWQgdGhlIGhpZ2hlc3QgbnVtYmVycyB3aXRoIDkxNSBjYXNlcywgMTUsNjY0IHRvdGFsIHZpb2xhdGlvbnMsIGFuZCAxMiw5NzkgYWZmZWN0ZWQgZW1wbG95ZWVzLiBJbiBmYWN0IHRvcCB0aHJlZSBpbmR1c3RyaWVzIG9mIHRoZSB0YWJsZSBhcmUgcmVsYXRlZCB0byBsYXVpc2VyIGFuZCBob3NwaXRhbGl0eSBidXNpbmVzczogRnVsbC1TZXJ2aWNlIFJlc3RhdXJhbnRzLCBMaW1pdGVkLVNlcnZpY2UgUmVzdGF1cmFudHMsIGFuZCBIb3RlbHMgKGV4Y2VwdCBDYXNpbm8gSG90ZWxzKSBhbmQgTW90ZWxzLiAgIAoKI1Byb2Nlc3M6IEZpcnN0LCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgaW5kdXN0cnkgKG5haWNzX2NvZGVfZGVzY3JpcHRpb24pLiBUbyBhbnN3ZXIgYWxsIHRocmVlIHBhcnRzIG9mIHRoZSBxdWVzdGlvbiB0b2dldGhlciwgSSB1c2VkIHRoZSBzdW1tYXJpemUoKSBmdW5jdGlvbjogRm9yIHRoZSBudW1iZXIgb2YgY2FzZXMsIEkgdXNlZCB0aGUgbigpIGZ1bmN0aW9uLiBTaW5jZSBlYWNoIHJvdyByZXByZXNlbnRzIGEgY2FzZSwgY291bnRpbmcgaG93IG1hbnkgdGltZXMgYSBpbmR1c3RyeSBuYW1lIGFwcGVhcnMgZ2l2ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBjYXNlcy4gRm9yIHRvdGFsIHZpb2xhdGlvbnMgYW5kIGFmZmVjdGVkIGVtcGxveWVlcywgSSB1c2VkIHRoZSBzdW0oKSBmdW5jdGlvbiBvbiB0aGUgcmVsZXZhbnQgY29sdW1ucy4gRmluYWxseSwgSSBhcnJhbmdlZCB0aGUgcmVzdWx0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBudW1iZXIgb2YgY2FzZXMuIApgYGB7cn0KCk1PX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkoIGluZHVzdHJ5ID0gbmFpY3NfY29kZV9kZXNjcmlwdGlvbikgJT4lCiAgc3VtbWFyaXNlICggY291bnQgPSBuKCksIAogICAgICAgICAgICAgIHRvdGFsX3Zpb2xhdGlvbiA9IHN1bSAoY2FzZV92aW9sdG5fY250KSwgCiAgICAgICAgICAgICAgdG90YWxfYWZmZWN0ZWRfZW1wbG95ZWVzID0gc3VtIChlZV92aW9sdGRfY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyAoY291bnQpKQoKYGBgCgpRMjUuIFdoaWNoIGluZGljYXRvcnMgb2YgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gZGF0YSBoYXZlIHRoZSBoaWdoZXN0IHRvdGFsIHZpb2xhdGlvbnMgaW4gTWlzc291cmk/IAojQW5zd2VyOiBTZXJ2aWNlX0NvbnRyYWN0X1Zpb2xhdGlvbjogNiwyMDguIGZvbGxvd2luZyBGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb246IDIsNDU1LiAKCiNQcm9jZXNzOiBNaXNzb3VyaSBXYWdlICYgSG91ciBDb21wbGluY2UgZGF0YSBzZXQgaGFzIDc1IHZhcmlhYmxlLCBoYWxmIG9mIHRob3NlIGFyZSByZWxhdGUgdG8gdm9pbGF0aW9uIGNvdW50LiBBbW9uZyB0aGVtIDYgdmVyaWFibGUgYXJlIG1vc3QgaW1wb3RhbnQgdG8gZm9sbG93IGFjY29kaW5nIHRvIERlcGFydG1lbnQgb2YgTGFib3IuIEkgbWVzc3VyZWQgdGhvc2UgZm9yIG5hdGlvbmFsIGRhdGEgYXMgd2VsbC4gVGhvc2Ugc2l4IGluZGljYXRvcnMvdmVyaWFibGVzIGFyZTogIGZsc2FfdmlvbHRuX2NudCAoRmFpciBMYWJvciBTdGFuZGFyZHMgQWN0IHZpb2xhdGlvbnMpLCBtc3BhX3Zpb2x0bl9jbnQgKE1pZ3JhbnQgYW5kIFNlYXNvbmFsIEFncmljdWx0dXJhbCBXb3JrZXIgUHJvdGVjdGlvbiBBY3QgdmlvbGF0aW9ucyksIHNjYV92aW9sdG5fY250IChTZXJ2aWNlIENvbnRyYWN0IEFjdCB2aW9sYXRpb25zKSwgZm1sYV92aW9sdG5fY250IChGYW1pbHkgYW5kIE1lZGljYWwgTGVhdmUgQWN0IHZpb2xhdGlvbnMpLCBoMWJfdmlvbHRuX2NudCAoSC0xQiB3b3JrIHZpc2EgdmlvbGF0aW9ucyksIGZsc2FfY2xfdmlvbHRuX2NudCAoQ2hpbGQgTGFib3IgdmlvbGF0aW9ucyB1bmRlciBGTFNBKS4gSSBzZWxlY3QgdGhvc2UgZm9yIHRvIHNob3cgdGhlbSBpbiBteSBhbmFseXNpcyBvbmx5LiBUaGVuLCBJIHVzZWQgdGhlIHN1bW1hcml6ZSgpIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHZpb2xhdGlvbnMgdW5kZXIgZWFjaCBsYXcuIEkgcmVuYW1lZCB0aGUgb3V0cHV0IGNvbHVtbnMgZm9yIGNsYXJpdHksIHNvIGVhY2ggdG90YWwgcmVmbGVjdHMgdGhlIHJlc3BlY3RpdmUgdmlvbGF0aW9uIHR5cGUuIEhvd2V2ZXIsIHRoZSB3YXkgdGhlIHJlc3VsdHMgd2VyZSBkaXNwbGF5ZWQgdXNpbmcgdGhlIHByZXZpb3VzIGZ1bmN0aW9uIG1hZGUgaXQgZGlmZmljdWx0IHRvIG1lYXN1cmUgb3IgYW5hbHl6ZSB0aGUgZGF0YSBjbGVhcmx5LiBUaGVyZWZvcmUsIEkgd2FudGVkIHRvIHJlc3RydWN0dXJlIHRoZSBvdXRwdXQgYnkgaGF2aW5nIGFsbCB2aW9sYXRpb24gdHlwZXMgbGlzdGVkIGluIG9uZSBjb2x1bW4gYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmlvbGF0aW9uIG51bWJlcnMgaW4gYW5vdGhlciBjb2x1bW4uIFRvIGFjaGlldmUgdGhpcywgSSB1c2VkIHRoZSBwaXZvdF9sb25nZXIoKSBmdW5jdGlvbi4gVGhlbiBhcnJhbmdlZCB0aGVtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIGVhc2llciBjb21wYXJpc29uIGFuZCBhbmFseXNpcy4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogICAgc2VsZWN0KGZsc2FfdmlvbHRuX2NudCwgbXNwYV92aW9sdG5fY250LCAgc2NhX3Zpb2x0bl9jbnQsIAogICAgICAgICBmbWxhX3Zpb2x0bl9jbnQsIGgxYl92aW9sdG5fY250LCBmbHNhX2NsX3Zpb2x0bl9jbnQpICU+JQogIHN1bW1hcml6ZSAoRmFpcl9MYWJvcl9TdGFuZGFyZHNfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIE1pZ3JhbnRfQWdyaWN1bHR1cmFsX1Byb3RlY3Rpb25fVmlvbGF0aW9uID0gc3VtIChtc3BhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCksCiAgICAgICAgICAgICBGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24gPSBzdW0gKGZtbGFfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgSW1taWdyYXRpb25fV29ya19WaXNhX1Zpb2xhdGlvbiA9IHN1bSAoaDFiX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIENoaWxkX2xhYm9yX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlZpb2xhdGlvbl9UeXBlIiwgdmFsdWVzX3RvID0gIlRvdGFsX0NvdW50IikgJT4lCiAgYXJyYW5nZShkZXNjKFRvdGFsX0NvdW50KSkKCmBgYAoKUTI2OiBIb3cgaGFzIHRoZSB2aW9sYXRpb24gbnVtYmVyIG9mIHRoZSA2IG1ham9yIGluZGljYXRvcnMgb2YgV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSBBY3Rpb24gZGF0YSB2YXJpZWQgb3ZlciB0aGUgeWVhcnMgaW4gTWlzc291cmk/CiNBbnN3ZXI6IFRoZSByZXN1bHRzIHNob3cgdGhhdCBhbGwgc2l4IG1ham9yIGluZGljYXRvcnMgaGF2ZSBkZWNyZWFzZWQgc2lnbmlmaWNhbnRseSBvdmVyIHRoZSBwYXN0IHRlbiB5ZWFycyBpbiBNaXNzb3VyaS4gSG93ZXZlciwgc29tZSBvZiB0aGVtIGV4cGVyaWVuY2VkIGluY3JlYXNlcyBkdXJpbmcgdGhlIG1pZC15ZWFycy4gRm9yIGV4YW1wbGUsIGR1cmluZyB0aGUgcGFuZGVtaWMgaW4gMjAyMCBhbmQgMjAyMSwgRmFpciBMYWJvciBTdGFuZGFyZHMgVmlvbGF0aW9ucyByb3NlIHRvIDE0MCwgYnV0IGRyb3BwZWQgdG8gMyBieSAyMDI0LiBTZXJ2aWNlIENvbnRyYWN0IFZpb2xhdGlvbnMgZmVsbCBmcm9tIDM3NSBpbiAyMDE3IHRvIHplcm8gaW4gMjAyNC4gQ2hpbGQgTGFib3IgVmlvbGF0aW9ucyBhbHNvIGRlY2xpbmVkLCBmcm9tIDYwIGluIDIwMTUgdG8gIDMgaW4gMjAyNC4gCiAgCiNQcm9jZXNzOiBUbyBhbmFseXplIHllYXItd2lzZSBkYXRhIGZvciBlYWNoIGluZGljYXRvciwgSSBmaXJzdCBncm91cGVkIHRoZSBkYXRhc2V0IGJ5IHllYXIuIFNpbmNlIHRoZSBkYXRhc2V0IHNwYW5zIGEgbG9uZyBwZXJpb2QsIEkgZmlsdGVyZWQgaXQgdG8gb25seSBpbmNsdWRlIHRoZSBtb3N0IHJlY2VudCAxMCB5ZWFycyB1c2luZyB0aGUgJWluJSBvcGVyYXRvci4gVGhlbiwgSSB1c2VkIHRoZSBzYW1lIGNvZGUgc3RydWN0dXJlIGZyb20gdGhlIHByZXZpb3VzIHF1ZXN0aW9uIHRvIHN1bW1hcml6ZSB2aW9sYXRpb25zIGZvciBzaXggbWFqb3IgaW5kaWNhdG9ycy4gSSBhbHNvIGludGVuZGVkIHRvIGNhbGN1bGF0ZSB0aGUgbmVnYXRpdmUgZ3Jvd3RoIHBlcmNlbnRhZ2Ugb3ZlciB0aGUgdGVuLXllYXIgc3BhbiB0byBzaG93IHRoZSByYXRlIG9mIGltcHJvdmVtZW50IGJ1dCB3YXMgdW5hYmxlIHRvIHdyaXRlIGEgY29kZSBpdCBzdWNjZXNzZnVsbHkuIEluc3RlYWQsIEkgc29ydGVkIHRoZSBzdW1tYXJpemVkIGRhdGEgYnkgeWVhciB0byBvYnNlcnZlIHRoZSB0cmVuZC4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGZpbHRlcihZZWFyICVpbiUgYygyMDE1LCAyMDE2LCAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxLCAyMDIyLCAyMDIzLCAyMDI0KSkgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc2VsZWN0KGZsc2FfdmlvbHRuX2NudCwgbXNwYV92aW9sdG5fY250LCAgc2NhX3Zpb2x0bl9jbnQsIAogICAgICAgICBmbWxhX3Zpb2x0bl9jbnQsIGgxYl92aW9sdG5fY250LCBmbHNhX2NsX3Zpb2x0bl9jbnQpICU+JQogIHN1bW1hcml6ZSAoRmFpcl9MYWJvcl9TdGFuZGFyZHNfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIE1pZ3JhbnRfQWdyaWN1bHR1cmFsX1Byb3RlY3Rpb25fVmlvbGF0aW9uID0gc3VtIChtc3BhX3Zpb2x0bl9jbnQpLCAKICAgICAgICAgICAgIFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCksCiAgICAgICAgICAgICBGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24gPSBzdW0gKGZtbGFfdmlvbHRuX2NudCksIAogICAgICAgICAgICAgSW1taWdyYXRpb25fV29ya19WaW9sYXRpb24gPSBzdW0gKGgxYl92aW9sdG5fY250KSwgCiAgICAgICAgICAgICBDaGlsZF9sYWJvcl9WaW9sYXRpb24gPSBzdW0gKGZsc2FfY2xfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKFllYXIpCgpgYGAKClEyNy4gSG93IGRpZCB0aGUgdG9wIGZpdmUgY2l0aWVzIGluIE1pc3NvdXJpIHdpdGggdGhlIGhpZ2hlc3QgdG90YWwgdmlvbGF0aW9ucyBvZiBXYWdlIGFuZCBIb3VyIENvbXBsaWFuY2Ugb3ZlciB0aGUgbGFzdCAxMCB5ZWFycyB2YXJ5PwojQW5zd2VyOiBBbW9uZyB0aGUgdG9wIGZpdmUgY2l0aWVzIGluIE1pc3NvdXJpIHRoYXQgcmVjb3JkZWQgdGhlIGhpZ2hlc3QgdG90YWwgdmlvbGF0aW9ucywgU1BSSU5HRklFTEQsIENPTFVNQklBLCBJTkRFUEVOREVOQ0UgZGlkIG5vdCBoYXZlIGFueSB2aW9sYXRpb25zIG9mIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSBpbiB0aGUgMjAyNC4gQWxsIGZpdmUgY2l0aWVzIGhhdmUgc2VlbiBkZWNyZWFzZXMgaW4gdG90YWwgdmlvbGF0aW9ucyBieSAyMDI0IGNvbXBhcmVkIHRvIDIwMTUuIEhvd2V2ZXIsIFNhaW50IExvdWlzIHJlY29yZGVkIGEgaGlnaGVyIG51bWJlciBvZiB2aW9sYXRpb25zIGluIDIwMjIgKDMxMikgdGhhbiBpbiB0aGUgcHJldmlvdXMgeWVhciAoMTYyKS4gQ29sdW1iaWEgZGVjbGluZWQgZnJvbSA1NTYgdmlvbGF0aW9ucyBpbiAyMDE1IHRvIHplcm8gZm9yIHRoZSBsYXN0IHR3byB5ZWFycy4gS2Fuc2FzIENpdHkgZXhwZXJpZW5jZWQgMiB2aW9sYXRpb25zIGluIDIwMjQsIGRvd24gZnJvbSA5NTcgaW4gMjAxNy4gU2FpbnQgTG91aXMgaGFkIHRoZSBoaWdoZXN0IHZpb2xhdGlvbnMgaW4gMjAxNywgd2l0aCAxLDMyNCwgYW5kIHJlbWFpbmVkIHRoZSB0b3AgY2l0eS4gSW5kZXBlbmRlbmNlIGFsc28gc2F3IHNwaWtlcyBpbiB2aW9sYXRpb25zLCByZWFjaGluZyAxLDYxMSBpbiAyMDE3LiBTcHJpbmdmaWVsZCBzaG93ZWQgY29uc2lzdGVudCBtaWQtdG8taGlnaCB2aW9sYXRpb25zLCB3aXRoIGEgcGVhayBpbiAyMDIwICg2NDEpLgoKI1Byb2Nlc3M6IFRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBJIGZpbHRlcmVkIHRoZSBkYXRhIGJ5IGJvdGggY2l0eSBhbmQgeWVhciwgYXMgSSBuZWVkZWQgaW5mb3JtYXRpb24gZm9yIGZpdmUgc3BlY2lmaWMgY2l0aWVzIG92ZXIgdGhlIGxhc3QgdGVuIHllYXJzLiBGcm9tIHRoZSBiZWdpbm5pbmcgb2YgbXkgY29kZSwgSSB1c2VkIHRoZSAlaW4lIG9wZXJhdG9yIHRvIHNlbGVjdCBvbmx5IHRoZSByZWxldmFudCB5ZWFycyBhbmQgY2l0aWVzLiBOZXh0LCBJIGdyb3VwZWQgdGhlIGRhdGEgYnkgYm90aCB5ZWFyIGFuZCBjaXR5LCBhcyBJIG5lZWRlZCB0aGUgdmlvbGF0aW9uIG51bWJlcnMgZm9yIGVhY2ggY2l0eSBhY3Jvc3MgZWFjaCB5ZWFyLiBBZnRlciBncm91cGluZywgSSBzdW1tYXJpemVkIHRoZSB0b3RhbCBudW1iZXIgb2YgdmlvbGF0aW9ucyBmb3IgZWFjaCBjb21iaW5hdGlvbiBvZiB5ZWFyIGFuZCBjaXR5LiBGaW5hbGx5LCB0byBwcmVzZW50IHRoZSBkYXRhIGluIGEgdGFidWxhciBmb3JtYXQsIEkgdXNlZCB0aGUgcGl2b3Rfd2lkZXIoKSBmdW5jdGlvbiB0byByZXNoYXBlIHRoZSBkYXRh4oCUbWFraW5nIGVhY2ggY2l0eSBhIHNlcGFyYXRlIGNvbHVtbiB3aXRoIHllYXJzIGFzIHJvd3MuCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCkpICU+JQogIGZpbHRlcihjdHlfbm0gJWluJSBjKCJTQUlOVCBMT1VJUyIsICJLQU5TQVMgQ0lUWSIsICJTUFJJTkdGSUVMRCIsICJDT0xVTUJJQSIsICJJTkRFUEVOREVOQ0UiKSkgJT4lCiAgZ3JvdXBfYnkoWWVhciwgY3R5X25tKSAlPiUKICBzdW1tYXJpemUodG90YWxfdmlvbGF0aW9uID0gc3VtKGNhc2VfdmlvbHRuX2NudCkpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAiY3R5X25tIiwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSAidG90YWxfdmlvbGF0aW9uIikgCgpgYGAKClEyOC4gV2hpY2ggV2FnZSBhbmQgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbiBjYXNlIGluIE1pc3NvdXJpIHRvb2sgdGhlIGxvbmdlc3QgdGltZSB0byBjb21wbGV0ZT8KI0Fuc3dlcjogVGhlIGNhc2UgbnVtYmVyIGlzIDEwMzU5NjcuIEl0IGlzIGFnYWluc3QgQmx1ZSBTcHJpbmdzIExhd24gJiBHYXJkZW4gZnJvbSBCbHVlIFNwcmluZ3MsIE1pc3NvdXJpLiBUaGlzIGNhc2UgdG9vayA0LDg0MCBkYXlzIHRvIGNvbXBsZXRlLCB3aGljaCBpcyBtb3JlIHRoYW4gMTMgeWVhcnMuIFRoZSBmaW5kaW5ncyBiZWdhbiBvbiBTZXB0ZW1iZXIgMjYsIDE5OTcsIGFuZCBlbmRlZCBvbiBEZWNlbWJlciAyNywgMjAxMC4KCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZmlyc3QgY3JlYXRlZCBhIG5ldyB2YXJpYWJsZSBpbiB0aGUgZGF0YXNldCBjYWxsZWQgRGF5c190b19jb21wbGV0ZSwgd2hpY2ggSSBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIGZpbmRpbmdzX3N0YXJ0X2RhdGUgZnJvbSBmaW5kaW5nc19lbmRfZGF0ZSB1c2luZyB0aGUgYXMubnVtZXJpYygpIGZ1bmN0aW9uLiBOZXh0LCBJIGZpbHRlcmVkIHRoZSBkYXRhIGJ5IHN0YXRlIGZvciBnZXQgb25seSBNTyBkYXRhLiBGaW5uYWx5IEkgYXJyYW5nZSB0aGUgZGF0YSBpbiBkZXNjZW5kaW5nIG9yZGVyIHRvIGZpbmQgdGhlIGFuc3dlci4gCmBgYHtyfQogCiAgVVNfd2FnZV90aGVmdCAlPiUKICBtdXRhdGUgKGZpbmRpbmdzX3N0YXJ0X2RhdGUgPSB5bWQgKGZpbmRpbmdzX3N0YXJ0X2RhdGUpLCAKICAgICAgICAgIGZpbmRpbmdzX2VuZF9kYXRlID0geW1kIChmaW5kaW5nc19lbmRfZGF0ZSksCiAgICAgICAgICBEYXlzX3RvX2NvbXBsZXRlID0gYXMubnVtZXJpYyAoZmluZGluZ3NfZW5kX2RhdGUgLSBmaW5kaW5nc19zdGFydF9kYXRlKSkgJT4lCiAgZmlsdGVyIChzdF9jZCA9PSAiTU8iKSAlPiUKICBhcnJhbmdlIChkZXNjKERheXNfdG9fY29tcGxldGUpKQoKYGBgCgpRMjkuIFdoYXQgYXJlIHRoZSBhdmVyYWdlIGFuZCBtZWRpYW4gZGF5cyB0byBjb21wbGV0ZSBhIFdhZ2UgYW5kIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb24gY2FzZSBpbiBNaXNzb3VyaT8KI0Fuc3dlcjogVGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGRheXMgdG8gY29tcGxldGUgYSBXYWdlICYgSG91ciBDb21wbGlhbmNlIHZpb2xhdGlvbiBjYXNlIGluIE1pc3NvdXJpIGlzIDU4OSBkYXlzLCBhbmQgdGhlIG1lZGlhbiBpcyA3MjggZGF5cywgd2hpY2ggaXMgYWxtb3N0IHR3byB5ZWFycy4KCiNQcm9jZXNzOiBUbyBmaW5kIHRoZSBhbnN3ZXIsIEkgZmlyc3QgY3JlYXRlZCBhIG5ldyB2YXJpYWJsZSBpbiB0aGUgZGF0YXNldCBjYWxsZWQgRGF5c190b19jb21wbGV0ZSwgd2hpY2ggSSBjYWxjdWxhdGVkIGJ5IHN1YnRyYWN0aW5nIGZpbmRpbmdzX3N0YXJ0X2RhdGUgZnJvbSBmaW5kaW5nc19lbmRfZGF0ZSB1c2luZyB0aGUgYXMubnVtZXJpYygpIGZ1bmN0aW9uLiBOZXh0LHRvIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBhbmQgbWVkaWFuIHZhbHVlcyBmb3IgdGhlIGRheXMgdG8gY29tcGxldGUsIEkgdXNlZCB0aGUgc3VtbWFyaXplIGZ1bmN0aW9uIGFuZCB3cm90ZSBjb2RlIHRvIGNvbXB1dGUgYm90aCB0aGUgbWVhbiAoYXZlcmFnZSkgYW5kIG1lZGlhbi4gSSBhbHNvIGFkZGVkIG5hLnJtID0gVFJVRSB0byBhdm9pZCB0aGUgTkEgdmFsdWVzIGluIHRoZSBjb2x1bW4uIFNpbmNlIHRoZSBjb2x1bW4gY29udGFpbmVkIGEgZmV3IE5BIHZhbHVlcywgdXNpbmcgbmEucm0gPSBUUlVFIGVuc3VyZWQgdGhhdCB0aGUgY2FsY3VsYXRpb24gd2FzIGJhc2VkIG9ubHkgb24gdGhlIGF2YWlsYWJsZSBkYXRhOyBvdGhlcndpc2UsIHRoZSByZXN1bHQgd291bGQgaGF2ZSBiZWVuIE5BLgpgYGB7cn0KClVTX3dhZ2VfdGhlZnQgJT4lCiAgbXV0YXRlIChmaW5kaW5nc19zdGFydF9kYXRlID0geW1kIChmaW5kaW5nc19zdGFydF9kYXRlKSwgCiAgICAgICAgICBmaW5kaW5nc19lbmRfZGF0ZSA9IHltZCAoZmluZGluZ3NfZW5kX2RhdGUpLAogICAgICAgICAgRGF5c190b19jb21wbGV0ZSA9IGFzLm51bWVyaWMgKGZpbmRpbmdzX2VuZF9kYXRlIC0gZmluZGluZ3Nfc3RhcnRfZGF0ZSkpICU+JQogIGZpbHRlciAoc3RfY2QgPT0gIk1PIikgJT4lCiAgc3VtbWFyaXplKGF2ZXJhZ2VfZGF5cyA9IG1lYW4oRGF5c190b19jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgIG1lZGlhbl9kYXlzID0gbWVkaWFuKERheXNfdG9fY29tcGxldGUsIG5hLnJtID0gVFJVRSkpCgpgYGAKClEzMC4gSW4gd2hpY2ggaW5kdXN0cnkgZG8gV2FnZSAmIEhvdXIgQ29tcGxpYW5jZSB2aW9sYXRpb24gY2FzZXMgdGFrZSB0aGUgbG9uZ2VzdCBtZWRpYW4gdGltZSB0byBjb21wbGV0ZT8gQW5kIGhvdyBoYXMgdGhlIHRpbWUgdG8gY29tcGxldGUgYSBjYXNlIGluIE1pc3NvdXJpIGNoYW5nZWQgaW4gdGhlIGxhc3QgMTAgeWVhcnM/CgojQW5zd2VyOiBUaGUgaW5kdXN0cnkgd2l0aCB0aGUgbG9uZ2VzdCBtZWRpYW4gdGltZSB0byBjb21wbGV0ZSBhIFdhZ2UgJiBIb3VyIENvbXBsaWFuY2UgdmlvbGF0aW9uIGNhc2UgaXMgVGVjaG5pY2FsIGFuZCBUcmFkZSBTY2hvb2xzLiBJdCB0YWtlcyAzLDUyMSBkYXlz4oCUb3IgYWJvdXQgbmluZSBhbmQgYSBoYWxmIHllYXJz4oCUdG8gY2xvc2UgYSBjYXNlIGluIHRoaXMgaW5kdXN0cnkuIEluIE1pc3NvdXJpLCB0aGUgbWVkaWFuIG51bWJlciBvZiBkYXlzIHRvIGNvbXBsZXRlIGEgY2FzZSBoYXMgZHJvcHBlZCBzaWduaWZpY2FudGx5IG92ZXIgdGhlIGxhc3QgMTAgeWVhcnMuIEluIDIwMTUsIGl0IHdhcyA3MjkgZGF5cywgYnV0IGluIDIwMjQsIGl0IGNhbWUgZG93biB0byBqdXN0IDE0NiBkYXlzLgoKI1Byb2Nlc3M6IFRvIGZpbmQgdGhlIG1lZGlhbiBudW1iZXIgb2YgZGF5cyB0byBjb21wbGV0ZSBhIGNhc2UgYnkgaW5kdXN0cnksIEkgZ3JvdXBlZCB0aGUgZGF0YXNldCBieSB0aGUgbmFpY3NfY29kZV9kZXNjcmlwdGlvbiBjb2x1bW4sIHdoaWNoIHJlcHJlc2VudHMgaW5kdXN0cnkgbmFtZXMuIFRoZW4sIEkgdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBtZWRpYW4gb2YgdGhlIERheXNfdG9fY29tcGxldGUgdmFyaWFibGUuIEkgYXJyYW5nZWQgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciB0byBpZGVudGlmeSB3aGljaCBpbmR1c3RyaWVzIHRha2UgdGhlIGxvbmdlc3QgdGltZS4gVG8gYW5hbHl6ZSBNaXNzb3VyaSdzIHRyZW5kIG92ZXIgdGhlIGxhc3QgMTAgeWVhcnMsIEkgZmlyc3QgZmlsdGVyZWQgdGhlIGRhdGFzZXQgZm9yIGNhc2VzIGluIE1pc3NvdXJpIGFuZCBmb3IgeWVhcnMgMjAxNSB0aHJvdWdoIDIwMjQuIFRoZW4sIEkgZ3JvdXBlZCB0aGUgZGF0YSBieSB5ZWFyLCB1c2VkIHRoZSBzdW1tYXJpemUoKSBmdW5jdGlvbiBhZ2FpbiB0byBmaW5kIHRoZSBtZWRpYW4gY29tcGxldGlvbiB0aW1lIGVhY2ggeWVhciwgYW5kIHRyYWNrZWQgaG93IGl0IGNoYW5nZWQgb3ZlciB0aW1lLgpgYGB7cn0KCk1PX3dhZ2VfdGhlZnQgJT4lCiAgZ3JvdXBfYnkobmFpY3NfY29kZV9kZXNjcmlwdGlvbikgJT4lCiAgc3VtbWFyaXplKG1lZGlhbl9kYXlzID0gbWVkaWFuKERheXNfdG9fY29tcGxldGUpKSAlPiUKICBhcnJhbmdlKGRlc2MobWVkaWFuX2RheXMpKQoKTU9fd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNywgMjAxOCwgMjAxOSwgMjAyMCwgMjAyMSwgMjAyMiwgMjAyMywgMjAyNCkpICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcml6ZShtZWRpYW5fZGF5cyA9IG1lZGlhbihEYXlzX3RvX2NvbXBsZXRlKSkgJT4lCiAgYXJyYW5nZSAoWWVhcikKCmBgYAoKClEzMS4gV2hpY2ggZW1wbG95ZXIgaW4gTWlzc291cmkgdmlvbGF0ZWQgdGhlIHNlcnZpY2UgY29udHJhY3QgdGhlIG1vc3QsIGFuZCB3aGljaCBpbmR1c3RyeSB0b3BzIHRoZSBsaXN0IGZvciBzZXJ2aWNlIGNvbnRyYWN0IHZpb2xhdGlvbnM/CiNBbnN3ZXI6IFRoZSBlbXBsb3llciB0aGF0IHZpb2xhdGVkIHRoZSBzZXJ2aWNlIGNvbnRyYWN0IHRoZSBtb3N0IGluIE1pc3NvdXJpIGlzIEFiYm90dCBBbWJ1bGFuY2UsIHdpdGggYSB0b3RhbCBvZiAxLDA4MyB2aW9sYXRpb25zLiBJbmR1c3RyeS13aXNlLCBUYXggUHJlcGFyYXRpb24gU2VydmljZXMgaGFkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBzZXJ2aWNlIGNvbnRyYWN0IHZpb2xhdGlvbnMsIHRvdGFsaW5nIDkyMC4KCiNQcm9jZXNzOiBUaGlzIHF1ZXN0aW9uIGhhcyB0d28gcGFydHMsIHNvIEkgd3JvdGUgdHdvIHNlcGFyYXRlIHBpZWNlcyBvZiBjb2RlLiBIb3dldmVyLCBib3RoIGZvbGxvd2VkIGEgc2ltaWxhciBzdHJ1Y3R1cmUsIHdpdGggb25seSB0aGUgZ3JvdXBpbmcgdmFyaWFibGUgYmVpbmcgZGlmZmVyZW50LiBUbyBmaW5kIHRoZSBlbXBsb3llciBhbmQgdGhlIGluZHVzdHJ5IHdpdGggdGhlIGhpZ2hlc3Qgc2VydmljZSBjb250cmFjdCB2aW9sYXRpb25zLCBJIHVzZWQgdGhlIGdyb3VwX2J5KCkgZnVuY3Rpb24gdG8gZ3JvdXAgdGhlIGRhdGEgYWNjb3JkaW5nbHkuIFRoZW4sIEkgdXNlZCB0aGUgc3VtbWFyaXplKCkgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBzZXJ2aWNlIGNvbnRyYWN0IHZpb2xhdGlvbnMuIEZpbmFsbHksIEkgYXJyYW5nZWQgdGhlIHJlc3VsdHMgaW4gZGVzY2VuZGluZyBvcmRlciBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHNlcnZpY2UgY29udHJhY3QgdmlvbGF0aW9ucy4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUgKFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MoU2VydmljZV9Db250cmFjdF9WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpemUgKFNlcnZpY2VfQ29udHJhY3RfVmlvbGF0aW9uID0gc3VtIChzY2FfdmlvbHRuX2NudCkpICU+JQogIGFycmFuZ2UgKGRlc2MoU2VydmljZV9Db250cmFjdF9WaW9sYXRpb24pKQoKYGBgCgpRMzIuIFdoaWNoIGVtcGxveWVyIGluIE1pc3NvdXJpIHZpb2xhdGVkIHRoZSBGYWlyIExhYm9yIFN0YW5kYXJkcyB0aGUgbW9zdCwgYW5kIHdoaWNoIGluZHVzdHJ5IHRvcHMgdGhlIGxpc3QgZm9yIEZhaXIgTGFib3IgU3RhbmRhcmRzIHZpb2xhdGlvbnM/CiNBbnN3ZXI6IFRoZSBlbXBsb3llciB0aGF0IHZpb2xhdGVkIHRoZSBGYWlyIExhYm9yIFN0YW5kYXJkcyBBY3QgdGhlIG1vc3QgaW4gTWlzc291cmkgaXMgRG9nIERheXMgQmFyIGFuZCBHcmlsbCwgd2l0aCBhIHRvdGFsIG9mIDQxIHZpb2xhdGlvbnMuIEluZHVzdHJ5LXdpc2UsIEZ1bGwtU2VydmljZSBSZXN0YXVyYW50cyBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIEZhaXIgTGFib3IgU3RhbmRhcmRzIHZpb2xhdGlvbnMsIHRvdGFsaW5nIDM3NS4KCiNQcm9jZXNzOiBUaGlzIHF1ZXN0aW9uIGhhcyB0d28gcGFydHMsIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIG9uZS4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBtYWluIHZhcmlhYmxlIHRoaXMgdGltZSBpcyBGYWlyIExhYm9yIFN0YW5kYXJkcy4gSSBzdW1tYXJpemVkIHRoZSBkYXRhIGluIGJvdGggcGllY2VzIG9mIGNvZGUgYnkgZ3JvdXBpbmcgZmlyc3QgYnkgZW1wbG95ZXIgYW5kIHRoZW4gYnkgaW5kdXN0cnkgbmFtZS4gRmluYWxseSwgSSBhcnJhbmdlZCB0aGUgcmVzdWx0cyBieSB0aGUgRmFpciBMYWJvciBTdGFuZGFyZHMgdmlvbGF0aW9uIGNvdW50IGluIGRlY2VuZGluZyBvcmRlci4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUgKEZhaXJfTGFib3JfU3RhbmRhcmRzX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhGYWlyX0xhYm9yX1N0YW5kYXJkc19WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpemUgKEZhaXJfTGFib3JfU3RhbmRhcmRzX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhGYWlyX0xhYm9yX1N0YW5kYXJkc19WaW9sYXRpb24pKQoKYGBgCgpRMzMuIFdoaWNoIGVtcGxveWVyIGluIE1pc3NvdXJpIHZpb2xhdGVkIHRoZSBGYW1pbHkgYW5kIE1lZGljYWwgTGVhdmUgQWN0IHRoZSBtb3N0LCBhbmQgd2hpY2ggaW5kdXN0cnkgdG9wcyB0aGUgbGlzdCBmb3IgRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdCB2aW9sYXRpb25zPwojQW5zd2VyOiBUaGUgZW1wbG95ZXIgdGhhdCB2aW9sYXRlZCB0aGUgRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdCB0aGUgbW9zdCBpbiBNaXNzb3VyaSBpcyBXZXN0IENvdW50eSBDYXJlIENlbnRlciwgd2l0aCBhIHRvdGFsIG9mIDEsMzgwIHZpb2xhdGlvbnMuIEluZHVzdHJ5LXdpc2UsIE51cnNpbmcgQ2FyZSBGYWNpbGl0aWVzIGhhZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdCB2aW9sYXRpb25zLCB0b3RhbGluZyAxLDQyMS4KCiNQcm9jZXNzOiBUaGlzIHF1ZXN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIHR3by4gVGhlcmVmb3JlLCBJIGZvbGxvd2VkIGFsbW9zdCB0aGUgc2FtZSBwcm9jZXNzIHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCB3aXRoIHRoZSBvbmx5IGNoYW5nZSBiZWluZyB0aGUgdmFyaWFibGUgcmVsYXRlZCB0byB0aGUgRmFtaWx5IGFuZCBNZWRpY2FsIExlYXZlIEFjdC4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUgKEZhbWlseV9NZWRpY2FsX0xlYXZlX1Zpb2xhdGlvbiA9IHN1bSAoZm1sYV92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpemUgKEZhbWlseV9NZWRpY2FsX0xlYXZlX1Zpb2xhdGlvbiA9IHN1bSAoZm1sYV92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhGYW1pbHlfTWVkaWNhbF9MZWF2ZV9WaW9sYXRpb24pKQoKYGBgCgoKUTM0LiBXaGljaCBlbXBsb3llciBpbiBNaXNzb3VyaSB2aW9sYXRlZCB0aGUgQ2hpbGQgTGFib3IgQWN0IHRoZSBtb3N0LCBhbmQgd2hpY2ggaW5kdXN0cnkgYW5kIGNpdHkgdG9wIHRoZSBsaXN0IGZvciBDaGlsZCBMYWJvciBBY3QgdmlvbGF0aW9ucz8KI0Fuc3dlcjogVGhlIGVtcGxveWVyIHRoYXQgdmlvbGF0ZWQgdGhlIENoaWxkIExhYm9yIEFjdCB0aGUgbW9zdCBpbiBNaXNzb3VyaSBpcyBEb2cgRGF5cyBCYXIgYW5kIEdyaWxsLCB3aXRoIGEgdG90YWwgb2YgNDEgdmlvbGF0aW9ucy4gSW5kdXN0cnktd2lzZSwgRnVsbC1TZXJ2aWNlIFJlc3RhdXJhbnRzIGhhZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgQ2hpbGQgTGFib3IgQWN0IHZpb2xhdGlvbnMsIHRvdGFsaW5nIDM3NS4gVGhlIGNpdHkgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgQ2hpbGQgTGFib3IgQWN0IHZpb2xhdGlvbnMgaXMgU1BSSU5HRklFTEQsIHdpdGggMTMzIGluY2lkZW50cy4KCiNQcm9jZXNzOiBUaGlzIHF1ZXN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIHRocmVlLCBidXQgdGhpcyB0aW1lIEkgYWxzbyBpbmNsdWRlZCBjaXR5IGFzIGFuIGFkZGl0aW9uYWwgZmFjdG9yIHRvIGlkZW50aWZ5IHdoaWNoIGNpdHkgaW4gTWlzc291cmkgZXhwZXJpZW5jZWQgdGhlIG1vc3QgQ2hpbGQgTGFib3IgdmlvbGF0aW9ucy4gVG8gYW5zd2VyIGFsbCB0aHJlZSBwYXJ0cyBvZiB0aGUgcXVlc3Rpb24sIEkgZm9sbG93ZWQgdGhlIHNhbWUgZ2VuZXJhbCBwcm9jZXNz4oCUZ3JvdXBpbmcgdGhlIGRhdGEgYnkgZW1wbG95ZXIsIGluZHVzdHJ5LCBhbmQgY2l0eeKAlHRoZW4gc3VtbWFyaXppbmcgdGhlIHRvdGFsIG51bWJlciBvZiBDaGlsZCBMYWJvciB2aW9sYXRpb25zLiBUaGUgb25seSBjaGFuZ2Ugd2FzIHVzaW5nIHRoZSB2YXJpYWJsZSByZWxhdGVkIHRvIENoaWxkX2xhYm9yX1Zpb2xhdGlvbi4KYGBge3J9CgpNT193YWdlX3RoZWZ0ICU+JQogIGdyb3VwX2J5KHRyYWRlX25tKSAlPiUKICBzdW1tYXJpemUgKENoaWxkX2xhYm9yX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhDaGlsZF9sYWJvcl9WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShuYWljc19jb2RlX2Rlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpemUgKENoaWxkX2xhYm9yX1Zpb2xhdGlvbiA9IHN1bSAoZmxzYV9jbF92aW9sdG5fY250KSkgJT4lCiAgYXJyYW5nZSAoZGVzYyhDaGlsZF9sYWJvcl9WaW9sYXRpb24pKQoKTU9fd2FnZV90aGVmdCAlPiUKICBncm91cF9ieShjdHlfbm0pICU+JQogIHN1bW1hcml6ZSAoQ2hpbGRfbGFib3JfVmlvbGF0aW9uID0gc3VtIChmbHNhX2NsX3Zpb2x0bl9jbnQpKSAlPiUKICBhcnJhbmdlIChkZXNjKENoaWxkX2xhYm9yX1Zpb2xhdGlvbikpCgpgYGAKClEzNS4gV2hpY2ggZW1wbG95ZXIvYnVzaW5lc3MgaW4gTWlzc291cmkgdmlvbGF0ZWQgYWxsIHNpeCBtYWpvciBpbmRpY2F0b3JzIG9mIFdhZ2UgYW5kIEhvdXJzIENvbXBsaWFuY2U/CiNBbnN3ZXI6IE5vbmUuCgojUHJvY2VzczogVG8gZ2V0IHRoZSBhbnN3ZXIsIEkgdXNlZCB0aGUgZmlsdGVyIGZ1bmN0aW9uLiBBcyBJIG5lZWRlZCB0byBmaW5kIHRyYWRlIG5hbWVzIG9mIGJ1c2luZXNzZXMgdGhhdCBoYWQgdmlvbGF0aW9ucyBpbiBhbGwgc2l4IGNhdGVnb3JpZXMsIEkgZmlsdGVyZWQgZm9yIHJvd3MgdGhhdCBoYWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvIGluIGFsbCBzaXggY29sdW1ucyAoc2luY2UgemVybyBtZWFucyBubyB2aW9sYXRpb24pLiBJIHdhbnRlZCB0byBzZWUgaWYgYW55IGNvbXBhbnkgaGFkIHZpb2xhdGlvbnMgaW4gYWxsIHNpeCBjYXRlZ29yaWVzLCB3aGljaCBpcyB3aHkgSSBmaWx0ZXJlZCB1c2luZyA+MCBmb3IgZWFjaCB2YXJpYWJsZS4gRmluYWxseSwgSSBzZWxlY3RlZCB0aGUgdHJhZGVfbm0gY29sdW1uIHNvIHRoYXQgaWYgYW55IGVtcGxveWVyIGhhZCB2aW9sYXRpb25zIGluIGFsbCBzaXggY2F0ZWdvcmllcywgdGhlaXIgdHJhZGUgbmFtZSB3b3VsZCBhcHBlYXIuICAgCmBgYHtyfQoKTU9fd2FnZV90aGVmdCAlPiUKICBmaWx0ZXIoZmxzYV92aW9sdG5fY250ID4gMCwKICAgIG1zcGFfdmlvbHRuX2NudCA+IDAsCiAgICBzY2FfdmlvbHRuX2NudCA+IDAsCiAgICBmbWxhX3Zpb2x0bl9jbnQgPiAwLAogICAgaDFiX3Zpb2x0bl9jbnQgPiAwLAogICAgZmxzYV9jbF92aW9sdG5fY250ID4gMCkgJT4lCiAgc2VsZWN0KHRyYWRlX25tKQoKYGBgCgo=